Laravel+Nginxで、htmlよりphpを優先したいケースがあったのでメモ。
(スマートじゃないかもしれない)
環境
Laravel homestead(2016/5/30時点の最新)
Ubuntu 14.04
Laravel 5.1
nginx/1.9.14
PHP 7.0.5-2+deb.sury.org~trusty+1 (cli) ( NTS )
リクエスト処理順
- Nginxの '/etc/nginx/nginx.conf' 内、 server>root に規定されたディレクトリ=webのルートになり、実在するファイルをチェック。あればそのままそれを表示。
- "/"で指定された場合の、優先順位はserver>indexの記載順。
ちなみに、Homesteadの場合は、上記configからincludeしている、/etc/nginx/sites-enabled/homestead.app
に実際の設定が記述されている。
デフォルト
server {
listen 80;
listen 443 ssl;
server_name homestead.app;
root "/home/vagrant/Code/Laravel/public";
index index.html index.htm index.php;
以下略)
- 上記の優先順位により、public以下のindex.phpを読み込む(Laravelの処理へ入る)
- index.phpの
$app = require_once __DIR__.'/../bootstrap/app.php';
が読み込まれることにより、Laravelの本流へ
- routes.phpに規定されたルーティングに応じて、Karnel.php に規定されたmiddlewareやContoller等が実行される
publicの下のファイルの優先順位をかえる。
/home/vagrant/Code/Laravel/public/original/ の下に、
- index.php
- index.html
を配置。index.phpを先に読み込ませたい。
server {
略)
# index index.html index.htm index.php;
index index.php index.html index.html;
以下略)
に書き換えて、# nginx -s reload
→結果、phpの方が先に読まれるようになった!
index.htmlへのアクセス
このままでは普通にブラウザから、ドメイン/original/index.html と打ったらアクセスできる。
index.htmlのアクセス拒否をするには
server {
(中略)
location ~ /\.ht {
deny all;
}
# 追加ここから
location ~* ^/.*/index.html$ {
deny all;
}
# 追加ここまで
ssl_certificate /etc/nginx/ssl/homestead.app.crt;
ssl_certificate_key /etc/nginx/ssl/homestead.app.key;
}
のように足してやればOK。
index.phpの中から、
readfile("index.html");
のように呼んでやれば、URLにindex.htmlを出さずに表示することができる。
別ディレクトリのindex.phpを呼び出す
(追記)
server {
(中略)
location ~* ^/apps/.+/$ {
index /apps/index.php;
}
(略)
}
みたいにしてやると、
ドメイン/apps/アプリ名/
にアクセスしたときに、
public/app/index.php
を呼ぶことができる。
参考)
http://qiita.com/syou007/items/3e2d410bbe65a364b603
http://tengine.taobao.org/nginx_docs/ja/docs/http/request_processing.html