我试图将我的站点重定向为始终在HTTPS中打开。我正在使用CloudFlare,它们的设置为“始终使用HTTPS”。但是我的网站上有一个页面,我不想使用HTTPS,因为它会在iFrame下打开其他网站。如果该页面也加载到HTTPS中,则在iFrame下不会打开未使用HTTPS提及其URL的网站。因此,对于该特定页面,我想保持网站在HTTP下打开。
我正在做的事情:
在CloudFlare加密设置中,“始终使用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,因此,除了surf.php之外,cloudflare中的“始终使用HTTPS”设置应该为ON。什么是最好的方法?
答案 0 :(得分:0)
听起来您处于重定向循环中。您拥有强制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 rewrite如果失败(错误)达到重写条件时,它将忽略下一个重写规则。因此,有了这个适当的位置,您的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开头(减去主机和协议)。
我承认我对MVC路由器破坏的复杂HTACCESS规则有些不满意,所以这可能不是100%正确的。但是总体思路是合理的。
无论如何希望它会有所帮助。