2010-03-30 73 views
0

我已经有这样的代码来强制这些URL以HTTPS:使用的.htaccess强制HTTP或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抓取出现问题。

干杯!

回答

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模式下。

+0

好吧,我明白了,我的HTTPS''RewriteRule'上的'L'标志表示,如果有匹配,我们使用HTTP,那么我们重定向,这是最后一条规则处理。但是如果我们已经在使用HTTPS呢?它会忽略我的原始条件并重定向回HTTP ......不是吗? – 2010-04-14 09:59:58

+0

实际上,当我测试它时,它永远不会将任何内容重定向到HTTPS,而总是重定向到HTTP。 – 2010-04-14 10:04:14

+0

你是对的,你将不得不为安全页面添加一个条件(将需要一些重复的东西)。请参阅编辑。 – Kazar 2010-04-14 10:11:23

1

由于您在规则中使用了L标志,因此您应该可以使用下面的RewriteCond重写任何在先前条件中未被捕获的HTTP请求?将它放在您发布的规则之后。这似乎有点太明显,但它可能会起作用。

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

我不太确定这是否会做到这一点 - 我太累了,无法确定!但希望它能指出你正确的方向。 – Seidr 2010-03-30 15:57:50

+0

明天我回去工作时,我会尝试并报告回来!谢谢:D – 2010-03-30 23:53:21

+0

不幸的是,这并没有工作 – 2010-04-14 09:13:13