使用php的http到https转发

Posted

技术标签:

【中文标题】使用php的http到https转发【英文标题】:http to https forwarding using php 【发布时间】:2014-10-11 10:10:15 【问题描述】:

我最近在域上设置了 SSL。这是在共享主机上,这似乎导致将站点重定向到https 时出现问题。我曾就这个问题向以前的questions 询问过,但没有成功。任何尝试似乎都会导致站点进入无限重定向循环。托管该站点的服务提供者为我提供了以下代码,它解决了重定向问题,但并非针对所有浏览器。在 Chrome 上,代码按预期工作,将http 页面转发到其https 对应页面。然而,Internet Explorer 中的测试似乎将所有页面转发到https 主页,而 Firefox 似乎只显示错误屏幕。代码如下

 <?php 
 if ($_SERVER['HTTP_X_FORWARDED_SSL'] == '1')       header("Location: $redirect");     else     $redirect = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];    header("Location: $redirect");  ?> 

谁能详细说明这段代码以找到解决这个长期存在的问题的方法。

【问题讨论】:

【参考方案1】:

使用此代码

$protocol = ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) ? 'https' : 'http';

【讨论】:

【参考方案2】:

我已经从if 语句的真实命令中删除了header("Location: $redirect");,并且该脚本现在似乎可以在所有浏览器上运行。

<?php 
 if ($_SERVER['HTTP_X_FORWARDED_SSL'] == '1')    else     $redirect = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];  header("HTTP/1.1 301 Moved Permanently");  header("Location: $redirect");  ?>

【讨论】:

【参考方案3】:

使用以下代码:

<?php
if(isset($_SERVER['HTTPS'])) 
   $prefix = 'https://';
 else 
$prefix = 'http://';


$location = $prefix.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
header("Location: $location");
exit;


?>

【讨论】:

对不起,和上一个答案一样的问题【参考方案4】:

我不知道为什么它不起作用,但请尝试下面的代码将 http:// 重定向到 https://

if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "")
    $redirect = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
    header("Location: $redirect");

这适用于所有浏览器。希望这对您有所帮助

【讨论】:

感谢您的及时回复。不幸的是,这段代码产生了同样的重定向循环问题。所以我更倾向于网站在共享主机上的问题。 此页面未正确转发。这与我之前就 htaccess 提出的问题相同。 ***.com/questions/25316295/… 好的,兄弟,一件事可能是您没有删除导致此重定向循环的 htaccess 代码,另一件事可能是您在输出后使用标头 htaccess 代码已被还原,我创建了一个 php 文件,其中仅包含此代码作为内容。 您是否在标题之前创建输出。也表示任何 html 标记或空格

以上是关于使用php的http到https转发的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 转发/重定向 HTTP PUT 请求?

nginx转发https到http

将 http 转发到 https - Elastic Beanstalk + Nginx

节点 http-proxy:将流量转发到外部 https 站点 - 崩溃

启用 SSL 后,Spark UI 不使用 HTTPS,而是通过 HTTP 转发到端口 0

启动 ngrok HTTP 隧道,但只转发到 HTTP 或 HTTPS,而不是两者