我有一个关于几个页面的HTTPS到HTTP重定向的具体问题。
Apache 2在Zope前面。
下面是我的VirtualHost在端口80上的配置:
<VirtualHost *:80>
ServerAdmin root@website.com
ServerName website.com
ServerAlias www.website.com
<IfModule mod_rewrite.c>
RewriteEngine On
# www to non www
RewriteCond %{HTTP_HOST} ^www.(.*) [NC]
RewriteRule ^/(.*) http://website.com/$1 [R=301,L]
# HTTP TO HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^/(.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>
</VirtualHost>
之后,当Zope监听SSL 8443端口时,我应用以下iptables规则:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 8443
因此,我的重写规则将80重定向到443,iptables将443重定向到8443。
在这种情况下,我如何重定向一个页面(比如“https://website.com/wiki/test_page.html**"”)到“http://website.com/wiki/test_page.html**"”。
我尝试添加以下规则:
# if https on then turn off
RewriteCond %{HTTPS} on
RewriteRule ^/wiki/test_page.html http://%{HTTP_HOST}%{REQUEST_URI}
但它不起作用
而不是做另一个重写规则,我认为它应该更容易防止,对于页面“/wiki/test_page.html”,HTTPS重定向,但我不知道如何实现这一点。
更新1
我试过:
# HTTP TO HTTPS except page "/wiki/test_page.html"
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^/wiki/test_page.html
RewriteRule ^/(.*) https://%{HTTP_HOST}%{REQUEST_URI}
没有成功。
更新2
我在我的问题上取得了进展。我的临时解决方案是申请:
RewriteEngine On
# www to non www and HTTP to HTTPS redirection for all website
RewriteCond %{REQUEST_URI} ^/www\. [NC,OR]
RewriteCond %{REQUEST_URI} !^/wiki/test_page\.html [NC]
RewriteRule ^/(.*) https://website.com/$1 [R=301,L]
# rewrite HTTPS to HTTP for test_page.html
#RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^/wiki/test_page\.html [NC]
RewriteRule ^/(.*) http://localhost:9674/++vh++http:%{SERVER_NAME}:80/++/$1 [P,L]
有了这些规则,我可以浏览我所有的网站与HTTPS链接除了/wiki/test_page. html页面.为此,我把,到包含链接的页面“/wiki/test_page.html
“,一个显式的HTTP href链接:
<a class="bottom_link" href="http://website.com/wiki/test_page.html">Test page</a>
以这种方式,应用最后一个重写规则(RewriteRule ^/(.*) http://localhost:9674/++vh++http:%{SERVER_NAME}:80/++/$1 [P,L]
),并且将80端口上的请求转发到Zope 3的9674 HTTP端口。
在下面的RewriteCond
中,我让你注意到,当我浏览我所有的HTTPS网站时,RewriteCond %{HTTPS} on
都不匹配。
# rewrite HTTPS to HTTP for test_page.html
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^/wiki/test_page\.html [NC]
RewriteRule ^/(.*) http://localhost:9674/++vh++http:%{SERVER_NAME}:80/++/$1 [P,L]
是因为Apache 2无法检测到Zope 3的HTTPS端口(8443或443)吗?
现在,我想直接将/wiki/test_page.html
上的HTTPS请求转发到Zope 3服务器上的HTTP请求(在9674端口上)。我认为解决方案可能来自修改此重写规则:
RewriteRule ^/(.*) http://localhost:9674/++vh++http:%{SERVER_NAME}:80/++/$1 [P,L]
我试着把它修改如下:
RewriteRule ^/(.*) http://localhost:9674/++vh++https:%{SERVER_NAME}:443/++/$1 [P,L]`
或
RewriteRule ^/(.*) http://localhost:9674/++vh++https:%{SERVER_NAME}:8443/++/$1 [P,L]
不幸的是,这不起作用:例如,如果我从包含链接“https://website.com/wiki/test_page.html“的页面中单击该链接,则不会针对上述RewriteRule重写URL。
1条答案
按热度按时间eimct9ow1#
好吧,在你的vhost文件中的规则对我来说看起来很好。确保你在每次更改后重新启动了apache,并且也清除了你的缓存,因为301重定向会被浏览器缓存。你也可以像下面这样将你的规则合并为1。这应该可以工作。