web-dev-qa-db-ja.com

Nginx deny-allは403.htmlのPHPコードの実行に失敗します

一部のディレクトリとファイルへのアクセスを拒否したいので、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;
    }
1
Alph

問題は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)$ブロックによって処理されます。

1
Richard Smith