![Nginx RegEx 匹配目录和文件](https://linux22.com/image/796182/Nginx%20RegEx%20%E5%8C%B9%E9%85%8D%E7%9B%AE%E5%BD%95%E5%92%8C%E6%96%87%E4%BB%B6.png)
我想知道是否有可能在同一位置匹配 Wordpress 目录和特定文件,因此目前我得到的规则仅匹配 wp-admin 目录:
## Restricted Access directory
location ^~ /wp-admin/ {
auth_basic "Access Denied!";
auth_basic_user_file .users;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
我也想匹配文件wp-login.php
但我无法工作,我尝试了以下操作:
location ^~ /(wp-admin/|wp-login.php) {
...
答案1
你的尝试没有成功,因为 nginx 选择的方式location
指令。使用 的块~
优先于使用 的块^~
,因此.php
块被选中wp-login.php
。最好的方法可能是在.php
块内捕获此内容:
location ~ \.php$ {
location ~ ^/wp-login\.php$ {
auth_basic "Access Denied!";
auth_basic_user_file .users;
}
fastcgi_pass unix:/var/run/php-fpm/www.sock;
...
}
答案2
在阅读您对 mgorven 的答案的评论后,我相信这就是您想要实现的。
将此块添加到您的 \.php$ 匹配块之前。
location ~* ^/wp-admin/$ {
allow 192.168.0.10;
deny all;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass your_back_endphp;
}
location ~* ^/wp-login.php$ {
allow 102.168.0.10;
deny all;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass your_back_endphp;
}
使用 wp-admin 时您不能拥有 fastcgi_split_path_info,因为这会破坏正在提供的样式和 js。