2011-08-31 66 views
0

我大吃一驚!我一直在嘗試幾個小時,通過.htaccess將兩個特定頁面重定向到HTTPS,並強制所有其他頁面始終使用HTTP。其中一個網址是動態的,這就是我的問題所在。沒有我找到的例子爲我工作。以下是我目前的代碼。我終於開始部分工作,所以它只是關閉SSL我需要幫助。唯一應該使用SSL的頁面是login.phpregister.php?country=xx,其中xx不同,並且始終爲小寫字母。動態URL的SSL重定向

Options +FollowSymLinks 
RewriteEngine on 

# Turn on ssl for specific pages 
RewriteCond %{HTTPS} off 
RewriteRule ^login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 
RewriteCond %{HTTPS} off 
RewriteCond %{QUERY_STRING} ^country=([a-z]+)$ 
RewriteRule ^register.php https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

# Turn off ssl when not accessing specific pages 
RewriteCond %{HTTPS} on 
RewriteCond %{SCRIPT_FILENAME} !\/register.php\?country=([a-z]+)$ [NC] 
RewriteCond %{SCRIPT_FILENAME} !\/login.php$ [NC] 
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

# Redirect non-canonical hostname requests, preserving http/https 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteCond %{SERVER_PORT}>s ^(443>(s)|[0-9]+>s)$ 
RewriteRule ^(.*)$ http%2://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

回答

0

您並不需要檢查country=xx是什麼 - 它是查詢字符串參數,並不重要。重定向到HTTPS應該發生在每個頁面的基礎上,而不是每個查詢字符串參數。

Options +FollowSymLinks -MultiViews 
RewriteEngine On 
RewriteBase/

# force https for /login.php and /register.php 
RewriteCond %{HTTPS} =off 
RewriteRule ^(login|register)\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

# don't do anything for images/css/js (leave protocol as is) 
RewriteRule \.(gif|jpe?g|png|css|js)$ - [NC,L] 

# force http for all other URLs 
RewriteCond %{HTTPS} =on 
RewriteCond %{REQUEST_URI} !^/(login|register)\.php$ 
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] 

# your other rewrite rules below 
  1. 這些規則需要放置在.htaccess在網站根文件夾之前的任何其它重寫規則(如果這樣存在)。如果放置在其他地方可能需要一些小的調整。

  2. 他們將

    • 力HTTPS進行/login.php/register.php
    • 無能爲力的圖像,CSS樣式和JavaScript文件(準確地說,與這些擴展名的文件)
    • ,將迫使所有其他URL的HTTP
  3. 您可以輕鬆地將其他URL添加到該列表 - 只需編輯現有規則addi將附加文件名添加到列表中(2個地方的相同文本:1)強制2)排除)

  4. 文件名區分大小寫。因此,如果請求/LOGIN.php(如果Linux是區分大小寫的操作系統,Apache將不會提供這些規則,因此這些規則將不起作用。因此,這裏不需要太多擔心)。

  5. 明顯的事情:mod_rewrite應該啓用,.htaccess文件需要由Apache處理(一些網站託管公司出於性能和安全原因禁用它們)。

重要提示: 這是非常有可能的是,這些規則不會爲你工作,立竿見影。這是因爲現代瀏覽器CACHE 301會重定向您以前的嘗試。因此,我建議在另一個瀏覽器上測試它,並在測試過程中將301更改爲302(302未緩存)或清除所有瀏覽器緩存(甚至可能是歷史記錄)並重新啓動瀏覽器。


BTW:

  1. 無需逃避斜線在%{SCRIPT_FILENAME} !\/login.php$

  2. %{SCRIPT_FILENAME}將只匹配文件名,絕對不是查詢字符串,因此!\/register.php\?country=([a-z]+)$毫無意義可言。

+0

感謝您的回覆。我的註冊頁面被設置爲首先用戶必須選擇他們的國家,而所有其他內容被隱藏,並且在他們做出選擇之後,顯示註冊表單。所以我試圖只確保表格的安全......我放棄了,我會保證整個頁面的安全。我試過你的代碼,但是有些東西不太對。關閉部分工作,但當我嘗試去登錄或註冊頁面,我得到「Internet Explorer無法顯示網頁」(通常,我使用Firefox,但我正在測試這與IE瀏覽器,因爲FF的愚蠢的新的持久性緩存問題)。 – Jen

+0

Ff告訴我:「Firefox已經檢測到服務器正在以一種永遠不會完成的方式重定向該地址的請求。」 – Jen

+0

另外:我不知道它是否有所作爲,但我正在測試我的主目錄的子文件夾,其中包含我整個站點的副本,以避免在測試時在活動網站上導致錯誤。 – Jen