2012-02-07 159 views
0

溶液下方覆蓋所需的規則:htaccess的:重定向HTTP到HTTPS或https爲http取決於URL

1)http://www.mydomain.com , http://www.mydomain.com/?p=home , http://www.mydomain.com/?p=home1 , http://www.mydomain.com/?qqq=home總是HTTP,即使HTTPS被鍵入的不是http;

2)即使輸入的是http而不是https,其餘所有頁面始終爲https,

但在實踐中不涵蓋

3)//www.mydomain.com/administration/any_file_in_admin_folder.php應該總是HTTPS以及(即使有參數P =家庭等)。

RewriteEngine on 
RewriteBase/

#determine if page is supposed to be http 
#if it has p=home or p=home1 or qqq=home in querystring 
RewriteCond %{QUERY_STRING} (^|&)(p=home1?|qqq=home)(&|$) [NC,OR] 
#or if query string is empty 
RewriteCond %{QUERY_STRING} ^$ 
#set env var to 1 
RewriteRule^- [E=IS_HTTP:1] 


#all pages that are supposed to be http redirected if https 
RewriteCond %{HTTPS} on 
RewriteCond %{ENV:IS_HTTP} 1 
RewriteRule^http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

#all other pages are sent to https if not already so 
RewriteCond %{HTTPS} off 
RewriteCond %{ENV:IS_HTTP} !1 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

如何實現3)這個代碼,所以它的工作原理? (我還沒有運氣,需要幫助)。 謝謝。

回答

2

試試這個: 添加的第一行第二& 3號地塊。

RewriteCond %{REQUEST_URI} !/administration/ [NC]

RewriteEngine on 
RewriteBase/

#determine if page is supposed to be http 
#Requested URi must not have administration in it 
RewriteCond %{REQUEST_URI} !/administration/ [NC] 
#if it has p=home or p=home1 or qqq=home in querystring 
RewriteCond %{QUERY_STRING} (^|&)(p=home1?|qqq=home)(&|$) [NC,OR] 
#or if query string is empty 
RewriteCond %{QUERY_STRING} ^$ 
#set env var to 1 
RewriteRule^- [E=IS_HTTP:1] [L] 

#all pages that are supposed to be http redirected if https 
RewriteCond %{REQUEST_URI} !/administration/ [NC] 
RewriteCond %{HTTPS} on 
RewriteCond %{ENV:IS_HTTP} 1 
RewriteRule^http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

#all other pages are sent to https if not already so 
RewriteCond %{HTTPS} off 
RewriteCond %{ENV:IS_HTTP} !1 
RewriteRule^https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
+0

謝謝。它的作品(你的答案是我試過的第一個)。任何人都可以猜測,爲什麼它有效,但是一旦我創建了一個密碼(我已經嘗試了兩種方式 - 使用主機面板設置 - >通過密碼保護文件夾,還創建.htaccess和.htpasswd文件)頁面管理/索引。 PHP重定向到404錯誤頁面。 IE說(如果我輸入了錯誤的密碼):另外,嘗試使用ErrorDocument來處理請求時遇到404 Not Found錯誤。如果我輸入正確,404錯誤頁面顯示沒有錯誤。這是怎麼回事?沒有密碼--everythigsOK。 – Haradzieniec 2012-02-07 20:05:53

+0

@Haradzieniec是否爲'401錯誤'定義了單獨的文檔? – ThinkingMonkey 2012-02-07 20:18:46

+0

@Haradzieniec它的工作原理是在第二和第三塊(指向'http'協議)中添加'RewriteCond%{REQUEST_URI}!/ administration/[NC]'來檢查URI中沒有'administration'。 – ThinkingMonkey 2012-02-07 20:20:30

1

您的第一條規則更改爲:

#determine if page is supposed to be http 
#if it has p=home or p=home1 or qqq=home in querystring 
RewriteCond %{QUERY_STRING} (^|&)(p=home1?|qqq=home)(&|$) [NC,OR] 
#or if query string is empty 
RewriteCond %{QUERY_STRING} ^$ 
#or if request URI is: /administration/any_file_in_admin_folder\.php 
RewriteCond %{REQUEST_URI} !^/*administration/any_file_in_admin_folder\.php$ [NC] 
#set env var to 1 
RewriteRule^- [E=IS_HTTP:1] 
+0

對不起,這是行不通的。管理文件夾中的任何文件仍然會轉到http(也可能來自https)。 – Haradzieniec 2012-02-07 16:10:58

+1

對不起,我之前犯了一個錯誤,只是修正了它。請嘗試。 – anubhava 2012-02-07 16:30:11

1

您的規則,RewriteCond %{QUERY_STRING} ^$匹配任何URL的第二部分沒有查詢字符串。您的網址//www.mydomain.com/administration/any_file_in_admin_folder.php沒有查詢字符串。所以IS_HTTP被設置爲1,並且你的用戶被重定向到HTTP。

試試這個。它沒有經過測試 - 但基本上,您首先要識別「主頁」查詢字符串,然後分別處理http://www.mydomain.com

#if it has p=home or p=home1 or qqq=home in querystring 
RewriteCond %{QUERY_STRING} (^|&)(p=home1?|qqq=home)(&|$) [NC] 
#set env var to 1 
RewriteRule^- [E=IS_HTTP:1] 

RewriteRule ^$ - [E=IS_HTTP:1] 

這也可能做的伎倆:

#determine if page is supposed to be http 
#if it has p=home or p=home1 or qqq=home in querystring 
RewriteCond %{QUERY_STRING} (^|&)(p=home1?|qqq=home)(&|$) [NC,OR] 
#or if query string is empty 
RewriteCond %{REQUEST_URI} ^$ 
#set env var to 1 
RewriteRule^- [E=IS_HTTP:1] 
+0

謝謝你的解釋!仔細閱讀。 – Haradzieniec 2012-02-10 22:45:58