条件重定向不在其他条件下工作

时间:2015-12-30 19:06:42

标签: php redirect

我们有一个旧网址,我们希望通过PHP重定向到新位置。 (请不要讲这是否是最好的方法;这是已经决定的。)

如果用户转到http://oldurl.com,我们希望重定向到http://newurl.com。如果他们转到http://oldurl.com/locations/illinois/12345(或此格式的任何其他基于位置的网址),我们希望重定向到http://newurl.com/locations/illinois/12345

<?php
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', $_SERVER['REQUEST_URI_PATH']);


if(is_array($segments) && in_array("locations", $segments)) {
    header('Location: http://newurl.com/locations/' . $segments[2] . '/' . $segments[3]);
}
else {
    header('Location: http://newurl.com');
}

if条件有效 - 它会重定向到动态构建的网址。但是,如果用户转到http://oldurl.com,而不是点击其他条件并重定向到http://newurl.com,则会保留原始网址并提供空白页面。

知道为什么吗?

2 个答案:

答案 0 :(得分:0)

is_array将始终在此实例中返回true因为路径,无论如何,即使它是根目录,也有一个/在开头。这将导致字符串像[0]/[1]

一样分割

如果您的REQUEST_URI是/,您将获得一个包含两个等于""的条目的数组

这应该有用。

<?php
    $_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    $segments = explode('/', $_SERVER['REQUEST_URI_PATH']);
    if(!(count($segments) == 2) && !(in_array("", $segments))) {
        header('Location: http://order.pizzahut.com/locations/' . $segments[2] . '/' . $segments[3]);
    }
    else {
        header('Location: http://order.pizzahut.com');
    }

如果我没有遗漏某些东西,这应该有效。

答案 1 :(得分:0)

这会有用吗?

<?php
$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$url = $_SERVER['REQUEST_URI_PATH'];
if (substr($url, 0, 7) == "http://")
$url = substr($url, 7, $url.length);

$segments = explode('/', $url, 2);

if(is_array($segments)) {
    header('Location: http://order.pizzahut.com/' . $segments[1]);
}
else {
    header('Location: http://order.pizzahut.com');
}

您可以在/

后面的斜杠http://的第一个版本中拆分,而不是在多个字符串中拆分网址。