【问题标题】:Redirecting site for HTTPSHTTPS 的重定向站点
【发布时间】:2019-05-22 11:33:27
【问题描述】:

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

我正在做的事情:

  1. 在 CloudFlare Crypto 设置中,“始终使用 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,所以 cloudflare 中的“始终使用 HTTPS”设置应该是 ON,除了 surf.php。这里最好的方法应该是什么?

【问题讨论】:

  • 我对 cloudflare 一无所知,但也许您应该使用 .htaccess 来更好地控制重定向。 stackoverflow.com/questions/5818146/…
  • 但是对于 surf.php 它说The page isn’t redirecting properly 并且页面没有打开。@ArtisticPhoenix

标签: php .htaccess


【解决方案1】:

听起来您正处于重定向循环中。您有一个强制使用 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 遇到 Rewrite 条件时,如果它失败(为 false),它将忽略下一个 rewrite 规则。因此,有了这个,您的 PHP 代码就可以完成它的工作,但您也可以单独在 htaccess 中执行此操作。因为无论如何你都会依赖其中的 URL,所以我在 .htaccess 文件中没有看到任何问题。

这基本上与上述相反,除非您知道 url。像这样的:

#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 中重定向,除了一个单页 surf.php。你真的阅读了整个问题吗?此代码放置在 surf.php 中,因为我希望它打开用户 HTTP 而不是 HTTPS。现在再次检查您的逻辑。
  • 固定,相同的主体。
  • 如果我删除了 PHP 重定向代码,那么这就是我在 .htaccess 中需要的全部内容了吗?
  • 不,你必须为/surf.php$做相反的事情
  • 我不喜欢这个 .htaccess 的东西。请更新您的代码,以便我可以复制和粘贴它。请。
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多