2011-02-11 54 views
0

我想重定向所有HTTPS URL中输入http重定向特定的URL(除了一个帐户/付款):问题尝试使用SSL

RewriteCond %{SERVER_PORT} =80 
RewriteCond %{REQUEST_URI} account/payment$ 
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

RewriteCond %{SERVER_PORT} =443 
RewriteCond %{REQUEST_URI} !account/payment$ 
RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule . - [L] 

RewriteRule . index.php [L] 

工作正常,但如果我要http://url/account/payment,它的重定向我http://url/index.php

谢谢

+0

我认为`REQUEST_URI`需要`/`匹配:`/ account/payment $` – 2011-02-11 13:24:23

回答

0

L flag使已经重写URL的再注入到重写的过程:

但是,请记住,如果RewriteRule生成内部重定向(在每个目录上下文中重写时经常发生),则会重新注入请求并导致从第一个RewriteRule开始重复处理。

为了避免要么你的前两个规则是这样的重新注入URL应用,检查request line代替:

RewriteCond %{SERVER_PORT} =80 
RewriteCond %{THE_REQUEST} ^GET\ /account/payment[?\ ] 
RewriteRule ^account/payment$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

RewriteCond %{SERVER_PORT} =443 
RewriteCond %{THE_REQUEST} !^GET\ /account/payment[?\ ] 
RewriteRule !^account/payment$ http://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 
0

每次RewriteRule比赛,阿帕奇做一个内部重定向和重新评估所有针对新(重写)路径的重写规则。

因此,当RewriteRule . index.php匹配时,REQUEST_URI更改为index.php并且所有重写规则将再次评估。

RewriteCond %{REQUEST_URI} !account/payment$index.php的计算结果为true,并且评估下一个规则:RewriteRule (.*) http://% {SERVER_NAME}%{REQUEST_URI},它将(从外部)重定向到index.php。