.htaccess https重定向单个页面(使用相对网址)

时间:2012-03-27 23:40:47

标签: .htaccess redirect https

我需要能够将单个页面从标准http重定向到https。例如,我想从http://domain.com/quote.php转到https://domain.com/quote.php

到目前为止,我在.htaccess文件中使用此代码,并且它正在用于初始重定向。

RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^quote.php https://domain.com/quote.php [R=301,L]

我的问题是,一旦我访问了quote.php页面并被重定向到https版本,我导航的所有其他网站页面继续使用https协议。这是一个潜在的重复内容问题,因为我现在可以通过http和https访问相同的内容。

所以我想做的是,能够做上面的重定向,然后以某种方式对除除quote.php之外的所有页面反向做同样的事情。因此,如果您尝试通过https访问它们,它将重定向到默认的http版本。

我在整个网站中使用相对URL,因此我不能简单地在https / http前缀中进行硬编码。如果可能的话,我需要能够通过.htacess这样做。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:8)

RewriteCond %{HTTPS}  off
RewriteRule  ^quote.php$  https://domain.com/quote.php  [R=301,L,QSA]

RewriteCond %{HTTPS}  on
RewriteCond %{REQUEST_URI}   !^/quote.php
RewriteRule  ^(.*)$  http://domain.com/$1  [R=301,L,QSA]

回答评论: 用于向conndtions添加新页面只需将它们括号括起来:

RewriteCond %{HTTPS}  off
RewriteRule  ^(quote|contact).php$  https://domain.com/$1.php  [R=301,L,QSA]

问题2:QSA标志将当前查询字符串添加到新URL。默认情况下会发生这种情况,除非您更改查询字符串。您现在可以安全地删除它们,但如果您添加了查询字符串,并且想要使用旧字符串,请将其放回去。


编辑2:
上面的代码有一点安全问题:(实际上它不止一点:-D。 当您使用https传输html代码并且页面使用相对路径时,这很好。但是当你将这些代码放在.htaccess中时,它们会变成http而这就是问题:-)。把下面的代码放在一起来解决问题:):

RewriteCond %{HTTPS}  off
RewriteRule  ^(quote|contact).php$  https://domain.com/$1.php  [R=301,L,QSA]


RewriteCond %{HTTPS}  on
RewriteCond %{REQUEST_URI}   !^/(quote|contact).php
RewriteCond %{REQUEST_URI}   !^/(.*)\.(css|png|js|jpe?g|gif|bmp)$
RewriteRule  ^(.*)$  http://domain.com/$1  [R=301,L,QSA]

现在,您在安全页面上使用的所有图像,脚本......都在安全地传输。