2011-11-17 104 views
0

在過去的幾個小時(天),我一直有一些麻煩,重定向到 頁。htaccess重定向到SSL

我的設置如下:我有在Debian在Apache 2.2.16的電子商務網站 以下的.htaccess(所有需要MODS啓用)

RewriteEngine On 
RewriteBase /shop 
RewriteCond $1 !^(index\.php|products|img|theme\.php|checkout\.php) 
RewriteRule ^(.*)$ index.php?/$1 [L] 

所有請求傳遞給指數。 PHP的作爲我的控制器,幷包括 其他.php文件的必要。

我現在想用HTTPS在結賬過程,是一個PHP腳本 巧妙地稱爲checkout.php

我認爲這將是爲改變我的.htaccess爲簡單:

RewriteEngine On 
RewriteBase /shop 
RewriteCond %{SERVER_PORT} !^443$ 
RewriteCond %{SERVER_URI} checkout\.php 
RewriteRule ^checkout.php?/$1 https://localhost/shop/checkout.php?/$1 [L,R] 
RewriteCond $1 !^(index\.php|products|img|theme\.php|checkout\.php) 
RewriteRule ^(.*)$ index.php?/$1 [L] 

所以checkout.php不會被index.php處理。顯然它並不是那麼簡單。我可以通過使用硬編碼的 https鏈接來結賬,但我更願意使用mod_rewrite來完成。 如果任何人都可以分享一些 洞察力,這將非常感激。

在此先感謝

+0

而不是檢查%{SERVER_PORT}嘗試檢查%{HTTPS} –

回答

0

有幾個問題。首先,您的第一個RewriteRule中的模式

RewriteRule ^checkout.php?/$1 https://localhost/shop/checkout.php?/$1 [L,R] 

寫入不正確。 $1在那裏沒有意義(這是一個捕獲結果,但沒有捕獲發生),並且查詢字符串(?之後的部分請求)不是匹配的部分,如RewriteRule documentation所述。

其次,我想你的意思是使用REQUEST_URI而不是SERVER_URI

所以我想你想是這樣的:

RewriteCond %{HTTPS} off 
RewriteCond %{REQUEST_URI} ^/checkout\.php 
RewriteRule .* https://localhost/shop/checkout.php [L,R] 

RewriteCond %{REQUEST_URI} !^/(index\.php|products|img|theme\.php|checkout\.php) 
RewriteRule ^(.*)$ /index.php?/$1 [L] 

的幾個注意事項:

  • 你並不需要匹配或在第一重寫規則的查詢字符串加回; mod_rewrite會自動將其重新加入。
  • 正如@Jon Lin所建議的,測試RewriteCond %{HTTPS} off而不是 RewriteCond %{SERVER_PORT} !443是常規操作。
  • 您可能需要在第二個RewriteRule中添加QSA flag