Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 有条件地将页面从http重定向到https或从https重定向到http_Php_.htaccess_Mod Rewrite - Fatal编程技术网

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

Php 有条件地将页面从http重定向到https或从https重定向到http,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,我试图编辑我的.htaccess文件,以便让用户通过SSL连接访问某些页面,而不是其他页面 例如,当访问名为login.php(有时是login.php?lo=true)的页面时,他们会在其登录详细信息中输入。在他们访问login.php之后,他们继续进行检查\u login.php,如果成功,他们将转到index.php 我的问题是:如何更改我的.htaccess文件,以便发生以下情况: http://www.site.com/login.php-->https://www.site.com

我试图编辑我的
.htaccess
文件,以便让用户通过SSL连接访问某些页面,而不是其他页面

例如,当访问名为
login.php
(有时是
login.php?lo=true
)的页面时,他们会在其登录详细信息中输入。在他们访问
login.php
之后,他们继续进行
检查\u 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的页面,或选中\u 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]

任何帮助都将不胜感激

不能将查询字符串放在规则的正则表达式中,只有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]

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


注意,我使用了302重定向进行测试。别忘了切换到301。

据我所知,
HTTPS
将启用或未设置。我没有看到过
off
@SalmanA,至少从那时起,“如果连接使用SSL/TLS,将包含文本”on“,否则将包含文本”off“。感谢您的回答,我尝试了一下,但是我更喜欢@SalmanA在4行而不是7行中完成
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]