.htaccess apache 2- https重定向到给定页面的http

ztmd8pv5  于 2023-04-12  发布在  Apache
关注(0)|答案(1)|浏览(132)

我有一个关于几个页面的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。

eimct9ow

eimct9ow1#

好吧,在你的vhost文件中的规则对我来说看起来很好。确保你在每次更改后重新启动了apache,并且也清除了你的缓存,因为301重定向会被浏览器缓存。你也可以像下面这样将你的规则合并为1。这应该可以工作。

# www to non www and http to https
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC, OR]
RewriteCond %{REQUEST_URI} !^/wiki/test_page.html [NC]
RewriteRule ^/?(.*) https://website.com/$1 [R=301,L]

相关问题