2

我有一个 wordpress 网站,我正试图锁定一组 IP。我将以下代码用作 index.php 中的第一件事:(此处为 IP 混淆)

$matchedIP = 0;
$IP = $_SERVER['REMOTE_ADDR'];

$validIPs = array("x.x.x.x", "x.x.x.x", "x.x.x.x", "x.x.x.x", "x.x.x.x");

foreach($validIPs as $validIP)
{
    if($IP == $validIP)
    {
        $matchedIP = 1;
    }
}

if($matchedIP == 0)
{
    header('Location: http://google.com.au');
}

IP 检查工作正常,因为各种断言可以确认。不起作用的是重定向,它永远不会发生。完整的 index.php 如下:

<?php

$matchedIP = 0;
$IP = $_SERVER['REMOTE_ADDR'];

$validIPs = array("x.x.x.x", "x.x.x.x", "x.x.x.x", "x.x.x.x", "x.x.x.x");

foreach($validIPs as $validIP)
{
    if($IP == $validIP)
    {
        $matchedIP = 1;
    }
}

if($matchedIP == 0)
{
    header('Location: http://google.com.au');
}

/**
 * Front to the WordPress application. This file doesn't do anything, but loads
 * wp-blog-header.php which does and tells WordPress to load the theme.
 *
 * @package WordPress
 */

/**
 * Tells WordPress to load the WordPress theme and output it.
 *
 * @var bool
 */
define('WP_USE_THEMES', true);

/** Loads the WordPress Environment and Template */
require('./wp-blog-header.php');

//require('./phpinfo.php');

奇怪的是,当注释掉 wordpress blog-header 要求并包含一个简单的 phpinfo 页面的要求时,重定向的行为符合预期。

我是否误解了 PHP 的处理方式以某种方式工作?当然,它甚至应该在考虑加载下面的任何所需文件之前点击重定向?

编辑:Windows IIS7 后端,PHP 版本 5.2.17,Wordpress 版本 3.4.2

4

2 回答 2

0

如果要进行正确的重定向,则必须在header-directive 之后终止脚本执行:

if(!in_array($IP, $validIPs))
{
    header('Location: http://google.com.au');
    exit(0);
}

原因是,如果你让 Wordpress 继续执行,它会发送一个 HTTP 状态码200,而浏览器会忽略Location标题。只有一部分 HTTP 状态代码使用了Location标头。

exit就位后,PHP 停止执行并自动发送HTTP302状态,告诉浏览器重定向到Location标头中指定的 URL。

于 2012-09-21T05:41:22.333 回答
0

你不需要for循环

<?php

$matchedIP = 0;
$IP = $_SERVER['REMOTE_ADDR'];

$validIPs = array("x.x.x.x", "x.x.x.x", "x.x.x.x", "x.x.x.x", "x.x.x.x");

if(in_array($IP, $validIPs))
{
    header('Location: http://google.com.au');
    exit(0);
}

?>
于 2012-09-21T05:45:31.923 回答