2013-01-10 176 views
3

我正在嘗試編輯我的.htaccess文件,以便讓用戶通過某些頁面的SSL連接,而不是其他頁面。有條件地重定向頁面從http到https或https到http

例如,當訪問名爲login.php(有時是login.php?lo=true)的頁面時,它們會在其日誌中輸入詳細信息。在他們訪問login.php之後,他們繼續前往check_login.php,如果他們成功了,他們將轉到index.php

我的問題是:如何更改我的.htaccess文件,以便以下發生:

  • http://www.site.com/login.php --->https://www.site.com/login.php,如果有變量,比如lo=true

  • http://www.site.com/check_login.php - >https://www.site.com/check_login.php

  • 任何其他頁面是不是的login.php或check_login.php是公正http,不https

我的ModRewrite規則的知識是有限的,到目前爲止,我已經實現了以下內容:

RewriteCond %{HTTPS} !=on 
RewriteRule ^login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
RewriteRule ^login\.php?lo=true$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

任何幫助將是很大的讚賞。

回答

3

沒有必要擔心的查詢字符串,除非你在更換URL使用?。下面是兩套你需要規則(第二組規則是第一的僅是相反的):

RewriteCond %{HTTPS} !=on 
RewriteRule ^(?:login\.php|check_login\.php)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L] 

RewriteCond %{HTTPS} =on 
RewriteRule !^(?:login\.php|check_login\.php)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=302,L] 

請注意,我已經使用302重定向進行檢測。不要忘記更改爲301.

3

您不能將查詢字符串放在規則的正則表達式中,只有URI被匹配,而不是查詢字符串。嘗試:

RewriteCond %{HTTPS} off 
RewriteRule ^login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

RewriteCond %{HTTPS} off 
RewriteRule ^check_login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

RewriteCond %{HTTPS} on 
RewriteCond %{REQUEST_URI} !^/?(check_)?login\.php 
RewriteRule^http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 
+0

據我所知,'HTTPS'將會'打開'或未設置。我沒有見過'關'。 –

+1

@SalmanA至少自[Apache 2.2](http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritecond),*「將包含文本」on「,如果連接使用SSL/TLS,否則「關閉」。「* –

+0

是的你是對的。我看着錯誤的地方。 –