2011-11-17 110 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