【问题标题】:WordPress site behind Apache reverse proxy keeps redirecting to localhostApache 反向代理背后的 WordPress 站点不断重定向到 localhost
【发布时间】:2021-04-14 20:33:06
【问题描述】:

我正在尝试使用 podman-compose(类似于 docker-compose)在生产服务器上部署容器化的 Wordpress。 Web 服务在主机的 8080 端口上公开。然后,我利用 Apache 的 ProxyPass 指令创建一个反向代理并将请求发送到 localhost:8080 正在为 WordPress 提供服务的地方,从而使 WordPress 在http://example.com 上可用。
我成功地将数据库和 wordpress 卷迁移到服务器。我遇到的第一个问题是 WordPress 将 localhost 存储为 siteurlhome 在 wpoptions 中,因此它无法在生产服务器上运行。将这些值更改为 example.com(我的域)后,它会一直重定向到 localhost。疯狂的! 这是我的 docker-compose.yaml:

version: "3.8"
services: 
  web:
    image: wordpress
    restart: always
    volumes:
      - wordpress:/var/www/html
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_NAME: db
      WORDPRESS_DB_PASSWORD: mypass
      WORDPRESS_DEBUG: 0
    depends_on:
      - db
    networks:
      - wpnet
  db:
    image: mariadb:10.5
    restart: always
    ports:
      - 6603:3306

    volumes:
      - wpdbvol:/var/lib/mysql

    environment:
      MYSQL_DATABASE: db
      MYSQL_USER: user
      MYSQL_PASSWORD: mypass
      MYSQL_ROOT_PASSWORD: mypass
    networks:
      - wpnet
volumes:
  wordpress: {}
  wpdbvol: {}

networks:
  wpnet: {}

这是我的反向代理配置:

<VirtualHost *:80>

ServerName example.com
ServerAlias www.example.com

ProxyPass "/"  "https://localhost:8080"

#Allows modification of Location: headers from backend server to point to the reverse proxy
ProxyPassReverse "/"  "http://localhost:8080"
</VirtualHost>

【问题讨论】:

  • 你发现了吗?可能有其他想法。
  • 并非如此。还是没有进展:(

标签: wordpress docker docker-compose podman podman-compose


【解决方案1】:

您的问题可能是您在代理传递网址末尾缺少/

在我的情况下,我想提供它:https://example.com

(wordpress 5.8.1)

在数据库中(或直接在 ui 中)我必须同时更新 siteurlhome

update wp_options set option_value="https://example.com" where option_name in ("siteurl", "home");

同时粘贴 apache 的反向代理设置(X-Forwarded-ProtoX-Forwarded-Port 是关键设置):

<VirtualHost *:443>
  ServerName example.com
  SSLEngine on
  SSLCertificateFile "/sslcert/server.crt"
  SSLCertificateKeyFile "/sslcert/server.key"

   ProxyRequests Off
   KeepAlive Off
   <Proxy *>
      Order deny,allow
      Allow from all
   </Proxy>

   # These are required for https reverse proxy to work with wordpress  (They are read from `wp-config.php`)
   RequestHeader set X-Forwarded-Proto "https"
   RequestHeader set X-Forwarded-Port "443"   

   ProxyPass / http://localhost:8080/
   ProxyPassReverse / http://localhost"8080/
   ProxyPreserveHost On
   ErrorLog "logs/wordpress.revproxy-sslerror_log"
   CustomLog "logs/wordpress.revproxy-sslaccess_log" common
</VirtualHost>

注意:在我的情况下,我已经使用反向代理作为 docker-compose 的服务对其进行了测试,因此在上述设置中,我使用的是 http://localhost:8080/ 而不是 http://wpcontainer/。但在您的情况下,上述内容应该按原样工作。

【讨论】:

  • 我将您的设置添加到我的 httpd 配置中,现在我不再重定向到 localhost,但该站点仅加载了部分内容,并且它在浏览器日志中提供了很多跨站点警告。有什么想法吗?
  • 您是否同时更改了siteurlhome?另外,也许您可​​以清除浏览器缓存。如果问题仍然存在,请发送导致问题的 url(复制自 devtoolsnetwork 标签:F12)?
  • “RequestHeader”为我解决了问题。谢谢
【解决方案2】:

这是一个长远的目标,很可能不会奏效。

也许可以尝试在 compose yml environment WORDPRESS_CONFIG_EXTRA 设置中将 https://example.com 定义为您的主页网址。

services: 
  web:
    image: wordpress
    restart: always
    volumes:
      - wordpress:/var/www/html
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: user
      WORDPRESS_DB_NAME: db
      WORDPRESS_DB_PASSWORD: mypass
      WORDPRESS_DEBUG: 0
      WORDPRESS_CONFIG_EXTRA: |
        
        /** define our home url */
        define('WP_HOME', 'https://example.com');
        define('WP_SITEURL', 'https://example.com');

    depends_on:
      - db
    networks:
      - wpnet

可能强制将 wordpress 安装到它的目的地并阻止它重定向回localhost




此外,当我在让 ngrok tunnelling 访问本地 wordpress 环境时遇到问题时,我必须安装 Relative URL wordpress 插件,以使我的隧道正常工作。

不确定这是否与您的问题相关,但可能值得安装 Relative URL 插件,并在尝试上述 WORDPRESS_CONFIG_EXTRA 想法之前查看这是否解决了您的本地主机重定向问题。

该插件已经有 2 年没有更新了,但在 ngrok 上仍然可以正常工作。插件实际上是 20 行 php,我猜可以将其放入您的函数中。

Ngrok 允许我通过像 http://example.ngrok.io/ 这样的 https 协议 url 访问我的本地 docker compose wordpress 环境,这对我处理本地 webhook 响应回调(我与 stripe 一起使用)很方便。

【讨论】:

  • 虽然大部分安装问题在这个改动之后都消失了,但是请求主页仍然会将浏览器放到本地主机。
  • 嗯,不太确定,希望你能解决。
【解决方案3】:

对于在 ssl 上运行 WP 时遇到此问题的每个人:

如果您将 Nginx 作为 Apache 的代理,则必须在 PHP 中使用 $_SERVER['HTTPS'] = 'On'; 显式设置 HTTPS 全局(最好在 wp-config.php 中),否则 WP 将继续重定向,因为 Nginx 在 ssl 上运行,但 Apache 不是,WP 只能看到 Apache 环境。

【讨论】:

    【解决方案4】:

    这可能为时已晚,但我在使用 nginx 和 apache 反向代理时遇到了同样的问题。解决方案很容易,但同样很难找到根本原因。解决方案:

    nginx 配置-> 将 $request_uri 添加到 proxy_pass

    proxy_pass http://127.0.0.1:8080$request_uri;

    更多信息在这里:

    https://www.digitalocean.com/community/questions/redirect-loop-with-wordpress-on-apache-with-nginx-reverse-proxy-and-https-on-ubuntu-16

    【讨论】:

    • 总的来说,我认为 nginx 的修复更容易
    猜你喜欢
    • 1970-01-01
    • 2020-09-11
    • 2019-03-19
    • 2017-01-23
    • 2016-11-13
    • 1970-01-01
    • 2017-07-09
    • 2019-08-31
    • 1970-01-01
    相关资源
    最近更新 更多