我对 Nginx 服务器密码保护完全感到困惑。它不能像我们想要的那样工作。这是我的 Nginx 网站配置块。
server {
listen 80;
server_name example.com;
return 301 http://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
root /var/www/example.com/public;
index index.html index.php;
access_log /var/www/example.com/access.log;
error_log /var/www/example.com/error.log;
location ~ /\.svn/* {
deny all;
}
location ~ \.(htaccess|htpasswd) {
deny all;
}
location ~ \.conf$ {
deny all;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
# Add trailing slash to */wp-admin requests.
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
# Directives to send expires headers and turn off 404 error logging.
location ~* \.(js|css|xml)$ {
expires 30d;
access_log off;
log_not_found off;
}
location ~* \.(?:ico|gif|jpe?g|png|svg)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public";
access_log off;
log_not_found off;
}
# W3TC rules
include /var/www/example.com/nginx.conf;
# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
include fastcgi_params;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
location /search {
limit_req zone=wpsearch burst=3 nodelay;
try_files $uri /index.php;
}
rewrite ^(.*)/undefined$ /$1 permanent;
rewrite ^(.*)/undefined/$ /$1 permanent;
# WordPress SEO Sitemap
rewrite ^/sitemap_index\.xml$ /index.php?sitemap=1 last;
rewrite ^/([^/]+?)-sitemap([0-9]+)?\.xml$ /index.php?sitemap=$1&sitemap_n=$2 last;
}
现在,当我用密码保护wp-admin
文件夹时,它无法正常工作。为了保护wp-admin
文件夹,我使用了这个...
location /wp-admin {
auth_basic "Restricted";
auth_basic_user_file /var/www/.htpasswd;
}
现在,如果我访问我的网站,www.example.com/wp-admin
它会要求输入密码。但如果我尝试使用此 URL 访问网站,www.example.com/wp-admin/index.php
服务器根本不会要求输入密码Http Authentication
,并轻松让我登录并访问管理部分。
所以问题是,虽然/wp-admin
有密码保护,但里面的内容没有。我仍然可以访问位于此文件夹中的图像文件、css、php 文件。
除此之外,我也想用密码保护/wp-login.php
,所以我添加了类似的块按照 WordPress codex 上的建议但 Nginx 根本不阻止它。
location /wp-login.php {
auth_basic "Restricted";
auth_basic_user_file /var/www/.htpasswd;
}
事实上,几乎所有的例子都来自WordPress codex 暴力攻击防护不起作用。
请解释一下这里到底是什么问题。我似乎遗漏了一些东西。
答案1
正则表达式位置始终优先。这意味着在这种情况下,您应该避免使用全局正则表达式位置。您当然可以在位置配置中将它们用作子位置。是的,这意味着您要与正则表达式位置匹配的所有内容的配置都是重复的。
您可以在正则表达式中使用负向后视来避免匹配不需要的文件(注意,应该可以工作但未经测试):
location ~ (?<!wp-admin\/).+\.php$ {
...
}
您的图像位置也是如此。
当然,完成此操作后,您应该在您的/wp-admin
位置中为 php 文件和图像添加子位置:
location /wp-admin {
...
location ~* \.(?:ico|gif|jpe?g|png|svg)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public";
access_log off;
log_not_found off;
}
}
至于wp-login.php
,有一个确切的位置优先于正则表达式的位置:
location =/wp-login.php {
...
}
但是,为了让 PHP-FPM 处理请求,您还必须在此位置指定 fastcgi 设置。
所有这些技巧都是可行的,但需要大量的复制粘贴,因为正则表达式位置不会继续从其他位置聚合设置并尽快终止。
在您的情况下,您只需在服务器配置中添加条件表达式,并避免所有这些复制粘贴:
if ( $uri ~ "^\/(wp-admin|wp-login)" ) {
auth_basic "Restricted";
auth_basic_user_file /var/www/.htpasswd;
}
然而使用“if”语句可能存在很多问题。你被警告了。