我希望如果我的访问者转到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重写。
提前致谢。
答案 0 :(得分:3)
$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/');
}