使用.htaccess强制使用HTTP或HTTPS

时间:2010-03-30 15:31:58

标签: http .htaccess https

我已经有了这段代码来强制使用这些网址:

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/my/?.*$
RewriteCond %{REQUEST_URI} !^/my/basket/add?.*$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/login/?.*$
RewriteCond %{REQUEST_URI} ^/logout/?.*$
RewriteCond %{REQUEST_URI} ^/register/?.*$
RewriteCond %{REQUEST_URI} ^/newsletter/?.*$
RewriteCond %{REQUEST_URI} ^/reset-password/?.*$
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

这非常有效,但我想做的是强制符合上述条件的任何网址到HTTP,触发301。

我不想创建HTTP页面列表,并像上面的HTTPS一样重定向它们。除非我以某种方式更改系统,否则安全页面URL将始终保持不变,但我可以在需要时更新它们。非安全页面可以通过动态创建/编辑,由一些销售团队创建/编辑,因此需要智能地定位。

有关如何做到这一点的任何想法? 要使用.htaccess来完成,我已经通过在PHP框架中处理它来实现这一点,但这导致了一个非常重要的性能问题,并导致我们的Google抓取问题

干杯!

2 个答案:

答案 0 :(得分:4)

Seidr对答案的修改,因为实际上你只想在HTTPS打开时重定向,当你想要它关闭时(也就是说,没有%{HTTP}变量)。再次,在你的所有规则之后加上这个。

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/login/?.*$
RewriteCond %{REQUEST_URI} !^/logout/?.*$
RewriteCond %{REQUEST_URI} !^/register/?.*$
RewriteCond %{REQUEST_URI} !^/newsletter/?.*$
RewriteCond %{REQUEST_URI} !^/reset-password/?.*$
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

虽然没有测试过,但不是100%它会起作用。

编辑:需要安全页面的条件,以便它们仍然处于HTTPS模式。

答案 1 :(得分:1)

当您在规则中使用L标志时,您应该能够使用RewriteCond(例如下面的那个)来重写以前在HTTP中没有捕获的任何请求吗?按照您发布的规则放置它。这似乎有点太明显了,但它可能会奏效。

RewriteCond %{REQUEST_URI} ^.*$
RewriteCond %{HTTP} OFF
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI} [L]