【问题标题】:Nginx 1.10 and WordPress 3.6.1 Permalink issueNginx 1.10 和 WordPress 3.6.1 永久链接问题
【发布时间】:2016-11-17 16:21:24
【问题描述】:

我在使用 nginx 时遇到了 WordPress 的永久链接问题。 我尝试在我的 nginx 配置文件中添加以下行,但我仍然无法让这些永久链接正常工作:

location / {
try_files $uri $uri/ /en/index.php?$args;
}

当我在 WordPress 控制面板中启用永久链接时,出现 404 错误。

这是我的 nginx 配置文件,如果这有助于调查问题,因为我已经尝试了网络上的几乎所有内容。我猜我的配置中有些东西搞砸了:

server {

        server_name blog.domain.com www.blog.domain.com;

        listen 161.122.20.14;

        return 301 https://$server_name$request_uri;
                ssl_certificate /home/domain/domains/blog.domain.com/ssl.cert;
                ssl_certificate_key /home/domain/domains/blog.domain.com/ssl.key;
        }

        server {
                server_name blog.domain.com www.blog.domain.com;

                listen 161.122.20.14:443 ssl http2;

                root /home/domain/domains/blog.domain.com/public_html;

                index index.html index.htm index.php;

                access_log /var/log/virtualmin/blog.domain.com_access_log;
                error_log /var/log/virtualmin/blog.domain.com_error_log;

        fastcgi_param GATEWAY_INTERFACE CGI/1.1;
                fastcgi_param SERVER_SOFTWARE nginx;
                fastcgi_param QUERY_STRING $query_string;
                fastcgi_param REQUEST_METHOD $request_method;
                fastcgi_param CONTENT_TYPE $content_type;
                fastcgi_param CONTENT_LENGTH $content_length;
                fastcgi_param SCRIPT_FILENAME /home/domain/domains/blog.domain.com/public_html$fastcgi_script_name;
                fastcgi_param SCRIPT_NAME $fastcgi_script_name;
                fastcgi_param REQUEST_URI $request_uri;
                fastcgi_param DOCUMENT_URI $document_uri;
                fastcgi_param DOCUMENT_ROOT /home/domain/domains/blog.domain.com/public_html;
                fastcgi_param SERVER_PROTOCOL $server_protocol;
                fastcgi_param REMOTE_ADDR $remote_addr;
                fastcgi_param REMOTE_PORT $remote_port;
                fastcgi_param SERVER_ADDR $server_addr;
                fastcgi_param SERVER_PORT $server_port;
                fastcgi_param SERVER_NAME $server_name;
                fastcgi_param HTTPS $https;

                location ~ \.php$ {
                        try_files $uri =404;
                        fastcgi_pass unix:/var/php-nginx/14765596504348.sock/socket;
                }

                location = /favicon.ico {
                log_not_found off;
                access_log off;
                }

                location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
                }

        location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
                access_log        off;
                log_not_found     off;
                expires 365d;
                }

                location ~* /(?:uploads|files)/.*\.php$ {
                deny all;
                }

                location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
                return 444;
                }

                location ~* \.(pl|cgi|py|sh|lua)\$ {
                return 444;
                }

                location ~ /(\.|wp-config\.php|readme\.html|license\.txt) { deny all; }

        ssl_certificate /home/domain/domains/blog.domain.com/ssl.cert;
                ssl_certificate_key /home/domain/domains/blog.domain.com/ssl.key;
                ssl_trusted_certificate /home/domain/domains/blog.domain.com/ssl.ca;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                ssl_prefer_server_ciphers on;
                ssl_dhparam /etc/nginx/dhparam.pem;
                ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

                add_header Accept-Ranges bytes;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header X-XSS-Protection "1; mode=block" always;
                add_header Strict-Transport-Security "max-age=15768000" always;
                add_header Public-Key-Pins 'pin-sha256="Niasdcu1LQAzCK234v6aJLcwJFCcWATc4asdIBhio7XpIQ="; pin-sha256="75h33riR+PAtOJcVKNfn2y1/N1ARLqJ213YDX5bnAi1Q="; max-age=2592000;';
        }

【问题讨论】:

    标签: wordpress nginx permalinks


    【解决方案1】:

    让我们看看您的重定向服务器块... 由于 WordPress 不允许或不喜欢您同时使用 www 和根域作为网站 url 的事实,因此您必须选择一个。假设您不想要 www 并且想要使用域本身,您的 first 重定向服务器块将如下所示:

    server {
        listen 161.122.20.14;
        server_name blog.domain.com www.blog.domain.com;
        return 301 https://blog.domain.com$request_uri;
    }
    

    这将有效地监听给定的 ip,端口 80 用于 blog.domain.com 和 www.blog.domain.com 将它们重定向到https://blog.domain.com

    现在我为什么要说首先?因为您可能希望有另一个重定向服务器块来捕获 www 域中的所有 https。在这种情况下,您需要确保您的服务器块具有有效的 ssl 配置集。无需更多调查并且仅从您的配置中获取,您的 ssl 重定向将如下所示:

    server {
        listen 161.122.20.14:443 ssl http2;
        server_name www.blog.domain.com;
    
        ssl_certificate /home/domain/domains/blog.domain.com/ssl.cert;
        ssl_certificate_key /home/domain/domains/blog.domain.com/ssl.key;
        ssl_trusted_certificate /home/domain/domains/blog.domain.com/ssl.ca;
    
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/nginx/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    
        return 301 https://blog.domain.com$request_uri;
    }
    

    现在我们确定所有对 blog.domain.com 或 www.blog.domain.com 的请求都在重定向方面得到了处理,在端口 80 和 443 上,我们的主服务器块看起来像所以:

    server {
        listen 161.122.20.14:443 ssl http2 deferred;
        server_name blog.domain.com;
    
        root /home/domain/domains/blog.domain.com/public_html;
        index index.html index.htm index.php;
    
        access_log /var/log/virtualmin/blog.domain.com_access_log;
        error_log /var/log/virtualmin/blog.domain.com_error_log;
    
        ssl_certificate /home/domain/domains/blog.domain.com/ssl.cert;
        ssl_certificate_key /home/domain/domains/blog.domain.com/ssl.key;
        ssl_trusted_certificate /home/domain/domains/blog.domain.com/ssl.ca;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/nginx/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    
        add_header Accept-Ranges bytes;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-XSS-Protection "1; mode=block" always;
        add_header Strict-Transport-Security "max-age=15768000" always;
        add_header Public-Key-Pins 'pin-sha256="Niasdcu1LQAzCK234v6aJLcwJFCcWATc4asdIBhio7XpIQ="; pin-sha256="75h33riR+PAtOJcVKNfn2y1/N1ARLqJ213YDX5bnAi1Q="; max-age=2592000;';
    
        location = /favicon.ico {
            log_not_found off;
            access_log off;
        }
    
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    
        location ~* .(js|css|png|jpg|jpeg|gif|ico)$ {
            access_log        off;
            log_not_found     off;
            expires 365d;
        }
    
        location ~* /(?:uploads|files)/.*\.php$ {
            deny all;
        }
    
        location ~* \.(engine|inc|info|install|make|module|profile|test|po|sh|.*sql|theme|tpl(\.php)?|xtmpl)$|^(\..*|Entries.*|Repository|Root|Tag|Template)$|\.php_ {
            return 444;
        }
    
        location ~* \.(pl|cgi|py|sh|lua)\$ {
            return 444;
        }
    
        location ~ /(\.|wp-config\.php|readme\.html|license\.txt) { deny all; }
    
        location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
        }
    
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }
            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass unix:/var/php-nginx/14765596504348.sock/socket;
        }
    }
    

    这里的关键是您的 try_files 并添加一个包含默认操作的 / location 块。您还应该保存该 php 位置块并将其用于将来的配置......另一个只是,怎么说,不安全。从本质上讲,这实际上是允许您在 WordPress 中使用永久链接的原因。

        location / {
            try_files $uri $uri/ /index.php?q=$uri&$args;
        }
    
        location ~ [^/]\.php(/|$) {
            fastcgi_split_path_info ^(.+?\.php)(/.*)$;
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }
            include fastcgi_params;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass unix:/var/php-nginx/14765596504348.sock/socket;
        }
    

    我还想知道你是从哪里想到将所有 fastcgi 参数放在你的配置中的。你从哪里得到这些信息的?

    请注意,我已从您发布的内容中复制/粘贴,而未检查所有内容是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2015-02-20
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多