2012-01-17 55 views
1

我写了一个脚本,强制通过http或https访问网站的某些部分。我们希望用户被重定向到正常的http页面,以防偶然降落到https版本,反之亦然。到目前为止,这么好,但我有两个问题给你们。强制http/https:如何检测https以及重定向时要发送哪个状态头?

  1. 什么是切换协议时发送的正确状态头?我目前在这两种情况下使用这种重定向之前:

    header('HTTP/1.1 301 Moved Permanently'); 
    
  2. 是什么,如果我们正在使用https来检测的首选方法是什么?

    // if ($_SERVER['SERVER_PORT'] == 443) /* EDIT: OK, not this? */ 
    
    if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on')) 
    

    还有别的吗?都?

回帖评论:

  • 我们使用Apache,但如果有一个通用的解决方案,将极大。

  • 我们不想使用.htaccess,因为https所需的页面由我们正在使用的CMS“标记”,并且这是其中的一部分。我们不想将URL“硬编码”到一个文件中。

+0

IIRC,'$ _SERVER ['HTTPS']'仅在某些服务器(即Apache)上存在。 – ceejayoz 2012-01-17 22:11:40

+2

检查端口不可靠。可以在443以外的端口上运行SSL,也可以在不使用HTTPS的情况下连接到端口443 *(尽管服务器通常会在发生错误时终止该请求)。 – animuson 2012-01-17 22:12:55

+0

为什么我不在这里闻到htaccess? – 2012-01-17 22:20:24

回答

2
  1. 301重定向是正确的方法。您不能在中途切换HTTP和HTTPS。该页面必须在客户端重新加载。
  2. 第二种方法,通过$_SERVER['HTTPS']是首选的方法。只需确保您的Web服务器支持它。
+0

你是什么意思“必须在浏览器中重新加载”?我们使用'header('Location:...')'重定向。我刚刚在这里看到http://stackoverflow.com/questions/452375/detecting-https-requests-in-php,可能有与Apache的替代方法,即$ _SERVER ['HTTP_HTTPS']'。我应该检查两者吗?我应该完全忽略$ _SERVER ['SERVER_PORT']的值吗?据我所知,这是不可靠的,但这是否意味着它是无用的? – 2012-01-17 22:38:33

+0

那么,如果不是浏览器,那么至少是客户端。该请求必须由客户端使用适当的协议(HTTPS vs HTTP)完成。 301重定向强制这一点。没有什么可以让客户端根据同一请求切换。是的,一些Apache服务器版本改为使用HTTP_HTTPS。只需检查您的版本的文档。 – 2012-01-17 22:41:37

+0

是的,这是一个新的请求,所有'$ _POST'数据和不会丢失。这是你的意思吗?我想在检查'HTTP_HTTPS'和'HTTPS'以查看其中一个是否“开启”,是正确的吗? – 2012-01-17 22:43:39

相关问题