修改响应 URL 或 Location 标头 Apache2 mod_proxy

修改响应 URL 或 Location 标头 Apache2 mod_proxy

我在服务器上运行一个 WordPress 网站,现在我需要在该服务器上部署一个 Web 应用程序,由于我们的 SSL 证书不是通配符,因此它也必须位于同一个域名下。现在它在不同的端口上运行,但用户抱怨访问起来不太友好。

我已经设置了一个反向代理,因为该应用程序由同一台计算机上的另一个服务运行,但是当请求返回给用户时,它会丢失 URL 的第一部分,因此最终出现 404 错误。

WordPress 网站正在运行www.example.com,Web 应用程序也应该处于打开状态,www.example.com/app但当请求返回时,URL 看起来www.example.com/Identity...就像www.example.com/app/Identity...

这是我在 WordPress 中使用的虚拟主机配置和 htaccess,用于允许 /app 通过 WordPress 路由。我尝试使用 ProxyPassReverse,但它不起作用,使用 mod_rewrite 也不是一种选择,因为来自 Web 应用程序的 URL 并不总是以相同的字符串开头。

虚拟主机:

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost

                ServerName www.example.com

                DocumentRoot /var/www/html

                        ProxyPreserveHost On
                        ProxyRequests Off
                        ProxyPass /app http://localhost:5000
                        ProxyPassReverse /app http://localhost:5000/app/

                Header unset X-Frame-Options

                LogLevel trace3

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile /etc/apache2/ssl/cert.pem
                SSLCertificateKeyFile /etc/apache2/ssl/private.key
                SSLCertificateChainFile /etc/apache2/ssl/intermediate.pem

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

Htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} ^/app.*$ [NC]
RewriteRule . - [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

提前致谢!

答案1

  1. 您可以从 .htaccess 文件中删除该条目,由于/app这些请求是通过代理进行的,因此该文件永远不会被读取。

  2. 您的配置存在错误:

    ProxyPass /app http://localhost:5000
    ProxyPassReverse /app http://localhost:5000/app/
    

    这些条目应该相同,都是localhost:5000/app/localhost:5000,具体取决于您的应用程序的配置。它们还应该在两个参数上都有一个尾部斜杠,或者两个参数上都没有。混合使用这两种方法会导致 URL 缺少斜杠或双斜杠。

  3. 配置您的应用程序以生成正确的 URL。通常有一个设置,通常称为“BaseURL”或类似名称。有关此信息,请参阅您的应用程序的文档。如果出于某种原因您的应用程序不支持此功能,您可以使用以下方式配置 Apache 以动态重写 URLmod_proxy_html 指令ProxyHTMLURLMap。然而,这是最后的解决方案,因为它要求 Apache 在提供每个响应之前重写它,这会给服务器增加不必要的额外负载。

相关内容