WordPresspipe理员密码保护在Nginx服务器上不起作用

我完全与Nginx服务器密码保护混淆。 它不工作,因为我们想要的。 这是我的Nginx网站configuration块。

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它要求input密码。 但是,如果我尝试使用这个URL www.example.com/wp-admin/index.php访问网站,那么服务器根本不要求Http Authentication ,并且容易让我login和访问pipe理部分。

所以问题是,虽然/wp-admin是密码保护,里面的内容不是。 我仍然可以访问这个文件夹中的图像文件,CSS,PHP文件。

除此之外,我也想密码保护/wp-login.php ,所以我添加了类似于WordPress codex的build议,但是Nginx根本不会阻止它。

  location /wp-login.php { auth_basic "Restricted"; auth_basic_user_file /var/www/.htpasswd; } 

事实上几乎所有来自WordPress的代码蛮力攻击保护的例子不起作用。

请解释究竟是什么问题。 看来我失去了一些东西。

正则expression式的位置总是优先。 这意味着你应该避免在这种情况下的全球正则expression式的位置。 您当然可以在您的位置configuration中将它们用作子位置。 是的,这意味着configuration重复您想要与正则expression式位置匹配的一切。

在正则expression式中,您可能会避免使用不需要的负面反向文件来匹配文件(谨慎,应该正常工作,但不要testing):

 location ~ (?<!wp-admin\/).+\.php$ { ... } 

这同样适用于您的图片位置。

当然,这样做之后,你应该在你的/wp-admin位置添加子文件和图片的位置:

 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 ,有一个确切的位置优先于正则expression式位置:

 location =/wp-login.php { ... } 

但是,您还必须在此位置指定fastcgi设置,以便使PHP-FPM处理请求。

所有这些技巧是可能的和工作,但需要大量的复制粘贴,因为正则expression式的位置不会继续聚集其他地点的设置,并尽快终止。

在你的情况下,你可以简单地添加条件expression式在你的服务器configuration,并避免所有这种复制粘贴:

 if ( $uri ~ "^\/(wp-admin|wp-login)" ) { auth_basic "Restricted"; auth_basic_user_file /var/www/.htpasswd; } 

但是使用“if”语句有很多可能的问题。 你已经被警告 。