我在服务器上运行一个 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
您可以从 .htaccess 文件中删除该条目,由于
/app
这些请求是通过代理进行的,因此该文件永远不会被读取。您的配置存在错误:
ProxyPass /app http://localhost:5000 ProxyPassReverse /app http://localhost:5000/app/
这些条目应该相同,都是
localhost:5000/app/
或localhost:5000
,具体取决于您的应用程序的配置。它们还应该在两个参数上都有一个尾部斜杠,或者两个参数上都没有。混合使用这两种方法会导致 URL 缺少斜杠或双斜杠。配置您的应用程序以生成正确的 URL。通常有一个设置,通常称为“BaseURL”或类似名称。有关此信息,请参阅您的应用程序的文档。如果出于某种原因您的应用程序不支持此功能,您可以使用以下方式配置 Apache 以动态重写 URLmod_proxy_html 指令
ProxyHTMLURLMap
。然而,这是最后的解决方案,因为它要求 Apache 在提供每个响应之前重写它,这会给服务器增加不必要的额外负载。