2010-03-30 129 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