一部のディレクトリとファイルへのアクセスを拒否したいので、deny_allオプションを使用して403.htmlページを返します。ただし、そのページでPHPコードを実行することはできません。
「内部」と関係がありますか?代わりに「return」または「error_page」を使用する必要がありますか?
ここに私の設定があり、他の提案は感謝しています...
#
# Redirect all to www
#
server
{
listen 80;
server_name site.com;
return 301 $scheme://www.site.com$request_uri;
}
#
# Validate and process requests
#
server
{
listen 80;
server_name www.site.com *.site.com;
root /var/www/site.com;
index index.html;
#
# Error and Access logs
#
error_log /var/log/nginx/error.site.log notice;
access_log /var/log/nginx/access.site.log;
error_page 403 /Src/403.html;
location = /Src/403.html
{
internal;
}
error_page 404 /Src/404.html;
location = /Src/404.html
{
internal;
}
location /
{
try_files $uri $uri/ =404;
}
location ~ \.(py|sh|tgz|xml)$
{
deny all;
}
location ~ \.(html|php)$
{
include fastcgi.conf;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.html;
try_files $uri.html $uri.php $uri/ =404;
}
問題はlocation
自体です。 nginx
は1つを選択しますlocation
はリクエストを処理します。 /Src/403.html
の場合、location = /Src/404.html
ブロックはlocation ~ \.(html|php)$
ブロックよりも優先されます。つまり、PHPディレクティブは含まれません。詳細については このドキュメント をご覧ください。
/Src/403.html
URIが内部のままであることを気にする場合は、必要なディレクティブをそのlocation
ブロックに含めます。例えば:
error_page 403 /Src/403.html;
location = /Src/403.html
{
internal;
include fastcgi.conf;
fastcgi_pass unix:/var/run/php5-fpm.sock;
}
それ以外の場合は、ロケーションブロック全体を削除できます。その場合、/Src/403.html
URIはlocation ~ \.(html|php)$
ブロックによって処理されます。