我试图将我的网站重定向到在HTTPS中始终开放。我正在使用CloudFlare,他们有一个设置为“始终使用HTTPS”。但是在我的网站上有一个页面,我不想使用HTTPS,因为它在iFrame下打开其他网站。如果该页面也加载到HTTPS中,那么在iFrame下,任何未被HTTPS提及的网站都不会打开。因此,对于这个特定的页面,我想让网站在HTTP下打开。
我正在做的事情:
surf.php我使用以下PHP代码:
if($_SERVER['HTTP_HOST'] != 'localhost'){
if(isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == 'on'){
if(!headers_sent()){
header("Status: 301 Moved Permanently");
header(sprintf('Location: http://%s%s',$_SERVER['HTTP_HOST'],$_SERVER['REQUEST_URI']));
exit();
}
}
}现在,页面没有打开,并说“页面没有正确地重定向”。我该怎么办?还有其他方法来完成这个任务吗?我想在整个网站中使用HTTPS,所以cloudflare中的“始终使用HTTPS”设置应该是打开的,只是surf.php而已。这里最好的方法是什么?
发布于 2018-12-22 08:52:40
听起来你在一个重定向循环中。其中有一个强制HTTPS的.htaccess文件,然后使用PHP重定向到HTTP。然后,该新请求具有适用于它的所有相同规则,以便.htaccess再次将其重定向到HTTPS,以此类推(无限)
因此,我首先要确保您的.htaccess文件中没有强制HTTPS。如果是这样的话,您可以添加一个RewriteCond来排除您的URL:
#RewriteEngine On #-- if not included elsewhere
#if HTTPS is not on (then continue)
RewriteCond %{HTTPS} !=on
#add this rule in (if not our page, then redirect to HTTPS)
RewriteCond %{REQUEST_URI} !^/surf\.php$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]当mod重写击中一个重写条件,如果它失败(为false),它将忽略下一个重写规则。这样,PHP代码就可以完成它的工作,但也可以单独在htaccess中完成。因为不管怎么说,您都将依赖于URL,所以在.htaccess文件中没有看到任何问题。
这将基本上是相反的上面的,除了你知道的网址。就像这样:
#if HTTPS is not on (then continue)
RewriteCond %{HTTPS} !=on
#add this rule in (if not our page, then redirect to HTTPS)
RewriteCond %{REQUEST_URI} !^/surf\.php$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
#if HTTPS is not off (then continue)
RewriteCond %{HTTPS}!=off
# (if is our page, then redirect to HTTP)
RewriteCond %{REQUEST_URI} ^/surf\.php$
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]不过,我真的不能测试这个,但这是一般的想法。如果HTTPS没有关闭,并且%{REQUEST_URI}是我们的页面!^/surf.php$重定向到HTTP.基本上,你必须通过HTTPS规则打一个洞,然后强制http。
我非常肯定,对于%{REQUEST_URI},您只需检查它是否以您的URL开始(减去主机和协议)。
我承认我对复杂的HTACCESS规则有点生疏,被MVC路由器破坏了,所以这很可能不是100%正确的。但总体观点是合理的。
希望能帮上忙。
https://stackoverflow.com/questions/53894196
复制相似问题