我有一台运行 httpd 的 centos 服务器。我在 staging.example.com 有一个网站,然后我有 staging.example.com/blog 或 staging.example.com/wiki。我正在处理博客部分。这是一个 wordpress 安装。如果您访问 staging.example.com/blog,它会转到 blog/wp-admin/setup-config.php 如果您尝试输入 staging.example.com/blog/wp-admin,它会重定向到 staging.example.com/wp-admin 如果您点击链接安装 wordpress,它会转到 staging.example.com/blog/wp-admin/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/core/install.php
我的 staging.example.com 位于 /var/ww/html/example.com 博客位于 /var/www/html/blog wiki 位于 /var/www/html/w
这是我的域特定配置:
NameVirtualHost staging.example.com:80
<VirtualHost *:80>
ServerName staging.example.com
ServerAlias staging.example.com
DocumentRoot /var/www/html/example.com
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{SERVER_NAME}$1 [R,L]
</VirtualHost>
NameVirtualHost staging.example.com:443
<VirtualHost *:443>
ServerName staging.example.com
ServerAlias staging.example.com
DocumentRoot /var/www/html/example.com
ErrorLog /var/log/httpd/example.com/error_log
CustomLog /var/log/httpd/example.com/requests.log combined
ProxyPreserveHost On
ProxyPass /blog http://localhost:8443
ProxyPass /wiki http://localhost:8444
# RewriteEngine On
</VirtualHost>
NameVirtualHost localhost:8443
<VirtualHost 127.0.0.1:8443>
DocumentRoot /var/www/html/blog
ErrorLog /var/log/httpd/example.com/blog/error_log
CustomLog /var/log/httpd/example.com/blog/requests.log combined
</VirtualHost>
NameVirtualHost localhost:8444
<VirtualHost 127.0.0.1:8444>
DocumentRoot /var/www/html/w
ErrorLog /var/log/httpd/example.com/wiki/error_log
CustomLog /var/log/httpd/example.com/wiki/requests.log combined
</VirtualHost>
是什么原因造成的?
答案1
尽管两种方式都有办法,但我发现当反向代理看到的路径(请求 URI)与原点看到的路径相同时,事情会顺利得多。这样,如果原点上的代码想要轻松生成有效的 URL(以 HTML 格式、重定向等格式),它只需基于本地 REQUEST_URI(以及通过 传入的 HTTP_HOST,对于绝对 URL 而言ProxyPreserveHost
)即可完美地生成它们。如果反向代理引入了诸如 之类的路径段blog
,则必须采取特殊步骤让 Wordpress 知道要注入blog
它写入的 URL,这样做时,URL 只能通过反向代理工作(没有反向代理的调试就会有问题)。
因此,在反向代理上ProxyPass /blog http://localhost:8443
使用而不是 ,这意味着在您的原始服务器( )上,您需要将目录作为 的子目录,而不是。例如,在 处创建一个新目录,然后将目录移动到新目录中并设置。wiki 也是如此。现在您处于和以及 WordPress 等效项实际上按预期运行的阶段。ProxyPass /blog http://localhost:8443/blog
<VirtualHost 127.0.0.1:8443>
blog
DocumentRoot
DocumentRoot
/var/www/html/wp
blog
wp
DocumentRoot /var/www/html/wp
$wgServer
$wgScriptPath
您还将玩同样的游戏,因为您在反向代理处终止 TLS,以便最终用户看到以 开头的 URL,https://
而原点上的代码看到HTTPS
变量未设置。不过,这更容易克服,最好处理这个问题并保持这种状态,而不是通过执行 来堆叠 TLS 延迟ProxyPass https://...
。基本上,您需要您的反向代理在它向原点发出的所有请求中添加一个 HTTP 标头X-Forwarded-Proto: https
,然后您需要您的代码(Wordpress 和 wiki)监视此标头并在https://...
存在时写入绝对 URL。或者跳过这一步,让 wp+wiki 始终以 编写 URL https://
,考虑到您的RewriteRule
。如果您不执行其中任何一项,您可能会看到大量混合内容错误,例如没有 CSS。