有条件地将页面从http重定向到https或https到http

时间:2013-01-10 09:03:40

标签: php .htaccess mod-rewrite

我正在尝试编辑我的.htaccess文件,以便让用户通过某些网页的SSL连接,而不是其他网页。

例如,当访问名为login.php的页面(有时为login.php?lo=true)时,他们会在其登录详细信息中输入。在他们访问login.php后,他们会前往check_login.php,如果他们成功,他们会转到index.php

我的问题是:如何更改.htaccess文件以便发生以下情况:

  • http://www.site.com/login.php ---> https://www.site.com/login.php以及是否存在lo=true

  • 等变量
  • http://www.site.com/check_login.php - > https://www.site.com/check_login.php

  • login.php或check_login.php只是http,而不是https

  • 的任何其他网页

我对ModRewrite规则的了解有限,到目前为止,我已实现了以下内容:

RewriteCond %{HTTPS} !=on
RewriteRule ^login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteRule ^login\.php?lo=true$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您不能将查询字符串放在规则中的正则表达式中,只能匹配URI,而不是查询字符串。尝试:

RewriteCond %{HTTPS} off
RewriteRule ^login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} off
RewriteRule ^check_login\.php$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/?(check_)?login\.php
RewriteRule ^ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

答案 1 :(得分:3)

除非您在替换网址中使用?,否则无需担心查询字符串。以下是您需要的两套规则(第二组规则与第一组完全相反):

RewriteCond %{HTTPS} !=on
RewriteRule  ^(?:login\.php|check_login\.php)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

RewriteCond %{HTTPS} =on
RewriteRule !^(?:login\.php|check_login\.php)$  http://%{HTTP_HOST}%{REQUEST_URI} [R=302,L]

请注意,我已使用302重定向进行测试。别忘了改为301。