重定向站点以使用HTTPS

时间:2018-12-22 08:39:26

标签: php .htaccess

我试图将我的站点重定向为始终在HTTPS中打开。我正在使用CloudFlare,它们的设置为“始终使用HTTPS”。但是我的网站上有一个页面,我不想使用HTTPS,因为它会在iFrame下打开其他网站。如果该页面也加载到HTTPS中,则在iFrame下不会打开未使用HTTPS提及其URL的网站。因此,对于该特定页面,我想保持网站在HTTP下打开。

我正在做的事情:

  1. 在CloudFlare加密设置中,“始终使用HTTPS”处于启用状态。

  2. 然后在我要用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。什么是最好的方法?

1 个答案:

答案 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%正确的。但是总体思路是合理的。

无论如何希望它会有所帮助。