使用 nginx 上游的 Wordpress 常量重定向

Posted

技术标签:

【中文标题】使用 nginx 上游的 Wordpress 常量重定向【英文标题】:Wordpress constant redirect with nginx upstream 【发布时间】:2017-01-13 07:29:23 【问题描述】:

出现了一种情况,运行 nginx 的 server1 会将所有“/”位置转发到 server2,同时将“/api”和其他一些位置保留在 server1 上。这也试图保持 SSL 正常工作。尝试将 WP 网址从 http://test.example.com 移动到 https://example.com 可以正确加载首页,但加载 wp-admin 会导致重定向过多。

Server1 Nginx:

上游 webapp_url 服务器IP:80; 服务器 听 443 ssl; server_name www.example.com example.com; access_log /var/log/nginx/example.log; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_ciphers RC4:HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers 开启; 位置/文件/ 根/家; access_log 关闭; 最大过期; if ($request_filename !~* ^.*?\.(jpg)|(png)|(gif)|(pdf)) add_header 内容处置:“$request_filename”; 地点 / # proxy_pass http://site_url/; proxy_http_version 1.1; proxy_set_header 升级 $http_upgrade; proxy_set_header 连接“升级”; proxy_set_header 主机 $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_cache_bypass $http_upgrade; proxy_set_header X-示例“1”; proxy_pass http://webapp_url/;

这可以很好地加载其他服务器,主页和链接都可以正常工作(尽管会出现混合内容警告,因为我无法在管理员中更改它)。 WP siteurlhome 都设置为新地址。

Server2 Nginx:

服务器 #听443 ssl; 听 80; server_name example.com test.example.com; client_max_body_size 30M; error_log /var/log/wordpress/error.log 信息; 地点 / 根 /home/wordpress; try_files $uri $uri/ /index.php?q=$request_uri; 索引 index.php index.html index.htm; #ssl_certificate /etc/nginx/ssl/example.crt; #ssl_certificate_key /etc/nginx/ssl/example.key; #ssl_ciphers RC4:HIGH:!aNULL:!MD5; #ssl_prefer_server_ciphers 开启; error_page 404 /404.html; 位置 = /404.html 根 /usr/share/nginx/html; error_page 500 502 503 504 /50x.html; 位置 = /50x.html 根 /usr/share/nginx/html; # 位置 ~ \.php$ 根 /home/wordpress; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 包括 fastcgi_params;

加载 /wp-admin/ 会启动无限重定向(到相同的 url)。我也在wp-config.php 中定义了它:

定义('WP_HOME','https://example.com'); 定义('WP_SITEURL','https://example.com');

【问题讨论】:

【参考方案1】:

wp-admin 检查连接是否安全,否则重定向到同一 URL 的 https 版本。在像您这样的情况下,这会导致重定向循环。

您需要告诉 WordPress 连接是安全的。

我注意到您在服务器 1 上设置了相应的标头:

proxy_set_header X-Forwarded-Proto $scheme;

(在您的情况下,$scheme 的值硬连线到 https)。

但是,您还需要将其以HTTPS 参数的形式传递给WordPress,其值为on

这是通过map 指令(在服务器 2 上)实现的:

map $http_x_forwarded_proto $https_flag 
    default off;
    https on;

server 
    ...

map 指令放置在 http 块内。您可以将它放在 server 块的上方,如上所示。有关详细信息,请参阅 this document)

另外,添加另一个fastcgi_param 以将HTTPS 参数传递给WordPress(在服务器2 上):

location ~ \.php$ 
    ...
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param HTTPS $https_flag;
    ...

【讨论】:

【参考方案2】:

第 1 步。

在您的服务器上启用并安装所需的 PHP 版本。

第 2 步。

sudo yum install php-cli php-pdo php-fpm php-mysqlnd

第 3 步。

sudo systemctl start php-fpm

第 4 步。

sudo systemctl enable php-fpm

最后复制Nginx配置

server 
    root /path/to/your/wordpress;
    index index.php index.html index.htm;
    server_name site.com www.site.com;
    add_header X-Frame-Options SAMEORIGIN;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    location ~ .php$ 
       try_files $uri =404;
       fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; # path might differ from OS to OS
       fastcgi_index index.php;
       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include fastcgi_params;
    

【讨论】:

以上是关于使用 nginx 上游的 Wordpress 常量重定向的主要内容,如果未能解决你的问题,请参考以下文章

Docker [emerg] 1#1:单独的撰写文件后在上游找不到主机

NGINX - 在标准错误中发送的 FastCGI:“主要脚本未知”,同时从上游读取响应标头

上游/下游术语向后使用? (例如 nginx)

NGINX *7060 上游超时(110:连接超时)

AWS Nginx“从上游读取响应标头时上游过早关闭连接”

nginx 上游服务器“端口不足”