Apache 从 URL 中删除目录

Apache 从 URL 中删除目录

我有一台运行 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>blogDocumentRootDocumentRoot/var/www/html/wpblogwpDocumentRoot /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。

相关内容