私の PHP には以下が含まれます:
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5.socket;
include /etc/nginx/fastcgi_params;
}
場所によってディレクトリ内のファイルへのアクセスを許可してみます:
location ~ /internal {
allow IP;
deny all;
}
動作しますが、このディレクトリ内の php ファイルはダウンロードできます。
答え1
留意点: Nginx は常にリクエストに一致するロケーション ブロックを 1 つだけ選択します。検索順序は次のとおりです。
=
^~
None
~
~*
@
そのため、リクエストは最初に/internal/foo.php
プレフィックスの場所で一致し/internal
、その後検索が終了し、正規表現はチェックされません。これが、PHP ファイルをリクエストするときにダウンロード ダイアログが表示される理由です。
重複を避けるには、共通のディレクティブを別のファイルに入れて、include
指令は次のようになります:
/etc/nginx/php.conf
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5.socket;
include /etc/nginx/fastcgi_params;
/etc/nginx/nginx.conf
location /internal {
allow IP;
deny all;
location ~ ^/internal(.*\.php)$ {
include php.conf;
}
}
location ~ \.php$ {
include php.conf;
}
答え2
次のように、/internal の場所の内側に php の場所を追加してみてください。
location ~ /internal/\.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5.socket;
include /etc/nginx/fastcgi_params;
}