【发布时间】:2011-12-05 18:35:49
【问题描述】:
我试图阻止通过 HTTPS 访问我网站上的某些页面,并且(无论出于何种原因)我想通过 PHP 而不是通过 .htaccess 来访问。
这是我正在使用的代码:
if ( isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ) {
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://mydomain.com");
}
但由于某种奇怪的原因,我陷入了无限循环,无法让它工作。当我在 firebug 中检查响应标头时,我看到 location 标头设置为 https://mydomain.com 而不是 http://mydomain.com,这导致了无限循环。
编辑:直接访问http://mydomain.com 确实有效。
另请注意:如果我将它们发送到不同的页面,这有效,但如果我将它们发送到同一页面,则无效。因此,如果我在mydomain.com/somePage.php 中运行上述代码,然后尝试通过https://mydomain.com/somePage.php 访问它,它将正确重定向到(非 SSL 版)主页。只有当我将它们重定向到具有不同协议的同一页面时,它才会忽略该协议。
我做错了什么?
【问题讨论】:
-
是
header("Location: http://而不是header("Location: https://的拼写错误……还是代码实际上是这样写的? -
@Dennis:对不起,你是对的。误解。我会在您的代码中查找导致从 http-> https 重定向的其他地方。你在 httpd.conf/.htaccess 中有什么东西吗?或者甚至是其他地方的另一个 PHP 块?
-
您需要
isset还是if (!empty($_SERVER['HTTPS']))就足够了?我不确定您是否需要在isset和== 'on'上加倍。如果它不是 https,则 $_SERVER['HTTPS'] 变量将为空,因此只需检查单个变量的值应该可以工作 - 至少这是我所假设的。我现在没有启用 HTTPS 的服务器进行测试。 -
如果你删除
301标头会怎样? -
古怪。如果明天没有答案,我会在工作的服务器上测试它,看看会发生什么。
标签: php apache redirect https http-headers