为 WordPress 设置 nginx 时出现的问题

为 WordPress 设置 nginx 时出现的问题

我的 /etc/nginx/sites-available/wordpress 中有以下 wordpress nginx 配置:

    index index.html index.htm index.nginx-debian.html;

    location / {
        proxy_pass http://nextjs;
        proxy_http_version 1.1;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_pass_request_headers on;
    }


    location /wordpress {
        root /var/www;
        try_files $uri $uri/wordpress/ /wordpress/index.php$is_args?$args;

            location ~ \.php$ {
            include fastcgi_params;
            fastcgi_pass unix:/run/php/php8.1-fpm.sock;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include snippets/fastcgi-php.conf;
                    fastcgi_buffers 1024 4k;
                    fastcgi_buffer_size 128k;
            }
    }

如您所见,WordPress 有一个基于 NextJS 的静态前端。而且总体来说,它运行良好。不过有一个问题无法正常工作,我不确定这是 WordPress 的问题还是 Nginx 的问题。

  • 当用户导航到 /wordpress 时,我们会看到来自 wordpress 的内容,这很好
  • 当用户导航到 /wordpress/graphql 时,grahpql 端点工作正常
  • 当用户导航到 /wordpress/wp-admin 时,事情就发生了变化。出现重定向循环,并且 brauser 报告网站未正确重定向等等
  • 当用户导航到 /wordpress/wp-admin/index.php 时,一切都正常运行。

那么,这是从哪里来的呢?是 Nginx 的问题吗?还是 WordPress 的问题?我该如何解决这个问题?

编辑 1:添加了 curl -vvv 输出:

C:\Users\alank>curl -vvv https://mydomain.ee/wordpress/wp-admin
*   Trying 194.204.13.171:443...
* Connected to mydomain.ee (194.204.13.171) port 443 (#0)
* schannel: disabled automatic use of client certificate
* ALPN: offers http/1.1
* ALPN: server did not agree on a protocol. Uses default.
* using HTTP/1.x
> GET /wordpress/wp-admin HTTP/1.1
> Host: mydomain.ee
> User-Agent: curl/8.0.1
> Accept: */*
>
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
< HTTP/1.1 302 Found
< server: nginx/1.18.0 (Ubuntu)
< date: Tue, 22 Aug 2023 10:19:10 GMT
< content-type: text/html; charset=UTF-8
< transfer-encoding: chunked
< expires: Wed, 11 Jan 1984 05:00:00 GMT
< cache-control: no-cache, must-revalidate, max-age=0
< link: <https://mydomain.ee/wordpress/wp-json/>; rel="https://api.w.org/"
< x-redirect-by: WordPress
< location: https://mydomain.ee/wordpress/wp-admin/
<
* Connection #0 to host mydomain.ee left intact

编辑2:curl -vvv 带有尾部斜杠:

C:\Users\alank>curl -vvv https://mydomain.ee/wordpress/wp-admin/
*   Trying 194.204.13.171:443...
* Connected to  mydomain.ee (194.204.13.171) port 443 (#0)
* schannel: disabled automatic use of client certificate
* ALPN: offers http/1.1
* ALPN: server did not agree on a protocol. Uses default.
* using HTTP/1.x
> GET /wordpress/wp-admin/ HTTP/1.1
> Host: mydomain.ee
> User-Agent: curl/8.0.1
> Accept: */*
>
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
* schannel: remote party requests renegotiation
* schannel: renegotiating SSL/TLS connection
* schannel: SSL/TLS connection renegotiated
< HTTP/1.1 302 Found
< server: nginx/1.18.0 (Ubuntu)
< date: Tue, 22 Aug 2023 11:13:01 GMT
< content-type: text/html; charset=UTF-8
< transfer-encoding: chunked
< expires: Wed, 11 Jan 1984 05:00:00 GMT
< cache-control: no-cache, must-revalidate, max-age=0
< link: <https://mydomain.ee/wordpress/wp-json/>; rel="https://api.w.org/"
< x-redirect-by: WordPress
< location: https://mydomain.ee/wordpress/wp-admin/
< 
* Connection #0 to host mydomain.ee left intact

答案1

重定向/wordpress/wp-admin/至其自身。

您是否尝试过使用官方提供的此用例的确切示例Nginx WordPress文档?

这里,针对您的使用情况进行了修改,使其不会影响.php外部/wordpress/

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

        location ~ \.php$ {
                fastcgi_split_path_info ^(/wordpress)(/.*)$;
        }
}

您的fastcgi_split_path_info意见与此建议不同。

答案2

您可以尝试在位置块中使用以下内容(根据需要随意调整路径),即/wp-admin/index.php?$args取决于您的环境/设置:

try_files $uri  $uri/ /index.php?$args;

参考:

相关内容