Nginxサーバー用に次の設定があります:
server {
listen 80 default_server;
server_name example.com www.example.com;
root /var/www/example.com/web;
index index.php index.html;
location / {
# try to serve file directly, fallback to rewrite
try_files $uri $uri/ @rewriteapp;
}
location @rewriteapp {
# rewrite all to index.php
rewrite ^(.*)$ /index.php last;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
}
そして、次のディレクトリ構造:
/ var/www/example.com /:
クライアントがヒットすると: 'example.com/dir/' then index.htmlが提供されます。
クライアントが次のような存在しないURLにアクセスすると、次のようになります。'example.com/non-existent/ 'then index.phpはルートディレクトリで提供されます。
しかし、クライアントがヒットすると: 'example.com/empty/' then 4ステータスコードが送信されます。
これは、ほとんどのWebサーバーで、フォルダのデフォルトのアクションが「ディレクトリ一覧」であり、デフォルトで無効になっているために発生します。ディレクトリインデックスを無効にすると、通常Apacheでも同じことが起こります。 nginxでできることは、try_filesディレクティブの最後に= 404を置くことです。
これを行うには、try_filesディレクティブの最後に/index.phpを置きます。ただし、セキュリティ上の理由により、これが常に推奨されるとは限りません。
また、設定にnginxの小さな誤解があります。$ uri /を$ uri/index.phpまたは$ uri/index.htmlなどに置き換える必要があります。 try_files $ uri /で停止します。その場所は検出されますが、ユーザーはその場所へのアクセスが禁止されているためです。
Nginxに404を送信させたい場合はいつでもそれ以外の場合は403を送信しますが、 _error_page
_ :
_server {
root /var/www/example.com/web;
error_page 404 /s/404.html;
error_page 403 =404 /s/404.html;
location /s/404.html { internal; }
# etc
}
_
location
行は、_http://example.com/s/404.html
_にも404を生成させます。