タイトルにすべてが書かれていますが、非常に興味深い問題があり、かなり混乱しています。基本的に、私は単純なWordPressインストールを行っており、フォルダーを(フォルダー内のすべてのファイルとともに)拒否したいのですが、たとえば/ wp-content/themes/default/scriptsを許可しますが、特定のIP。
Nginxの第一人者が言うように、場所が_^~/wp-content/themes/default/scripts {deny all;}
_のこのフォルダーを拒否できます。
しかし、私の理解では、「^」の方が優先され、正規表現の一致が見つかると、他のロケーションブロックの検索が停止します。すべての人のフォルダーを拒否したくないので(もちろん、allow (IP Address);
を使用して、私の_^~/wp-content/...
_ロケーションブロックはPHP-FPMロケーションブロックを完全に消し去り、ファイルをFastCGIサーバーに渡します。そしてもちろん、フォルダ内のファイルを表示しようとすると、PHPは解析していないため、PHPファイルは直接ダウンロードされます。
誰かアイデアがありますか?フォルダをブロックしたいのですが、許可することにしたユーザーに対してPHPが同時に機能するためには、かなり難しい質問です。問題に対する答えが見つかりません。
みんなありがとう!本当にあなたの助けに感謝します!
不思議に思う人のために、私の現在のNginx仮想ホスト構成は次のようになります:
_server {
#..all of the common stuff you would expect
include /folder/nginx.conf; #including some WordPress rewrites for W3 Total Cache
# pass the PHP scripts to FastCGI server listening on UNIX socket
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
fastcgi_read_timeout 1900;
}
location / {
#allowing some IPs...
#deny everyone else
deny all;
#WordPress rewrite for slugs
index index.php;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php last;
}
#rewrite for sitemaps
rewrite ^(.*/)?sitemap.xml /wp-content/sitemap.php last;
}
# denying access to .htaccess files
location ~ /\.ht {
deny all;
}
}
_
ついに答えが見つかりました。このようなことをしているときは、PHP-FPM設定(location ~ \.php$ { (this code) }
ブロックにあったすべてのもの)を再宣言する必要があります。
したがって、冗長性を回避するために、これらの値を別のファイルに入れて、次のようなものを残しました。
server {
# pass the PHP scripts to FastCGI server listening on UNIX socket
location ~ \.php$ {
include /etc/nginx/fastcgi_php_text;
}
location / {
index index.php;
}
location ^~/folder/ {
deny all;
allow ...;
include /etc/nginx/fastcgi_php_text;
}
}
これがそのようなための最良の方法であるかどうかはわかりませんが、これが私が理解した唯一の方法です。
@ nameによるロケーションブロック を定義して参照することもできます。から nginxの落とし穴ページ
server {
location ~ \.php$ {
try_files @fascgi;
}
location ^~ /folder {
deny all;
allow 127.0.0.1;
location ~ \.php$ {
try_files @fascgi;
}
}
location @fascgi {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
}