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

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

我对 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”语句可能存在很多问题。你被警告了

相关内容