正确地重定向访问者(PHP和Regex)

时间:2012-06-25 14:04:45

标签: php regex redirect preg-match

我希望如果我的访问者转到subdomain.example.com,他们会被重定向到anothersubdomain.example.com。如果他们转到css.subdomain.example.com,他们会被重定向到css.anothersubdomain.example.com

我尝试了以下正则表达式(使用preg_match):

尝试1:

if(preg_match('#(([\w\.-]+)\.subdomain|subdomain)\.example\.com#', $_SERVER['SERVER_NAME'], $match)) {
    header('Location: http://'.$match[1].'anothersubdomain.example.com/');
}

如果他们转到:subdomain.example.com,他们会被重定向到:anothersubdomain.example.com

但如果他们转到:css.subdomain.example.com,他们也会被重定向到:subdomain.example.com - 这样就无法使用了

尝试2:

if(preg_match('#([\w\.-]+)\.subdomain\.example\.com#', $_SERVER['SERVER_NAME'], $match)) {
    header('Location: http://'.$match[1].'.anothersubdomain.example.com/');
}

如果他们转到:css.subdomain.example.com,他们会被重定向到:css.anothersubdomain.example.com

但如果他们转到:subdomain.example.com,他们会被重定向到:.subdomain.example.com - 并且该网址无效,因此此尝试也无效。

有人有答案吗?我不想使用nginx或apache重写。

提前致谢。

2 个答案:

答案 0 :(得分:3)

worked for me

$tests = array(
    'subdomain.example.com' => 'anothersubdomain.example.com',
    'css.subdomain.example.com' => 'css.anothersubdomain.example.com'
);

foreach( $tests as $test => $correct_answer) {
    $result = preg_replace( '#(\w+\.)?subdomain\.example\.com#', '$1anothersubdomain.example.com', $test);
    if( strcmp( $result, $correct_answer) === 0) echo "PASS\n";
}

我所做的是使“第一个”子域的捕获组可选。所以,如果你打印出如下结果:

foreach( $tests as $test => $correct_answer) {
        $result = preg_replace( '#(\w+\.)?subdomain\.example\.com#', '$1anothersubdomain.example.com', $test);
    echo 'Input:    ' . $test . "\n" . 
         'Expected: ' . $correct_answer . "\n" . 
         'Actual  : ' .$result . "\n\n";
}

你会得到as output

Input:    subdomain.example.com
Expected: anothersubdomain.example.com
Actual  : anothersubdomain.example.com

Input:    css.subdomain.example.com
Expected: css.anothersubdomain.example.com
Actual  : css.anothersubdomain.example.com

现在将其应用于您的需求:

if( preg_match( '#(\w+\.)?subdomain\.example\.com#', $_SERVER['SERVER_NAME'], $matches)) {
    echo header( 'Location: http://'. (isset( $matches[1]) ? $matches[1] : '') .'anothersubdomain.example.com/');
}

答案 1 :(得分:0)

if(preg_match('#(\w*\.?)subdomain\.example\.com#', $_SERVER['SERVER_NAME'], $match)) {
    header('Location: http://'.$match[1].'anothersubdomain.example.com/');
}