我对 http 配置还算是个新手,所以请耐心等待(我继承了对这个系统的支持)。
我的 Web 服务器运行在 F5 后面,F5 负责处理所有 https 握手。如果传入请求是针对 http 的,F5 会将请求传递到端口 80 上的 Web 服务器。如果传入请求是针对 https 的,F5 会处理所有握手,然后将请求传递到端口 81 上的 Web 服务器。
我的 httpd.conf 文件设置为监听端口 80 和 81。为端口 81 定义了一个虚拟主机:
<VirtualHost 172.10.112.10:81>
ServerName example.com
DocumentRoot /usr/local/mwi/www/winxp/81
RewriteEngine on
RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$
RewriteRule .* - [F]
</VirtualHost>
指令“RewriteEngine on”、“DocumentRoot /usr/local/mwi/www/winxs/80”以及所有 RewriteCond 和 RewriteRule 都在虚拟主机块之外(并且不在任何其他块中),我认为它们是全局指令。
我的问题是重写规则在以下情况下正确处理http://example.com/whatever被使用,但如果请求https://example.com/whatever。该网站返回 404(页面未找到)。我昨天在 apache 网站上发现,如果存在与传入请求匹配的虚拟主机块,则会忽略全局指令。
我搜索后发现,我可以使用 htaccess 文件来实现这一点,但由于性能不佳而不建议这样做(我确实可以访问主 httpd.conf 文件)。
我是否需要为端口 80 创建一个额外的虚拟主机块并将所有重写指令移到其中?
我是否还需要将所有重写指令复制到端口 81 的虚拟主机?
我希望为两个端口仅维护一组 Rewrite 指令。如何才能最好地实现这一点?
提前致谢。
哈雷
答案1
答案2
JayMcTee - 谢谢。我使用了您的答案并解决了我的问题。我必须为端口 80 请求创建一个虚拟主机并删除全局重写指令。
从我对 Apache 文档的理解来看,我认为无论请求来自哪个端口,全局重写指令都会被使用。深入阅读文档后,我发现有一条声明,如果请求由虚拟主机处理,则只会使用该虚拟主机中指定的重写指令。最初,我尝试简单地复制端口 81 虚拟主机中的重写指令,但仍然有问题。然后,我为端口 80 创建了一个虚拟主机,并在两个虚拟主机中使用了 Include 指令。
问题解决了!