0

我一直在尝试解决这个问题将近 2 个小时,但无法让它工作,所以我希望你们中的一些人能帮助我。请注意我对 PHP 和正则表达式很陌生。

好的,所以我正在尝试设置一个重定向,该重定向将根据子域中的文本重定向到某些页面。我为我的子域设置了通配符,并且任何子域 URL 现在都重定向到包含以下代码的这个 php 文件。

因此,如果有人访问 anytexthere.domain.com,他们会到达 domain.com/redirect.php

此 php 文件将用于将它们发送到正确的相关 URL。

为此,我将使用诸如anyhere-1.domain.com 之类的子域,然后让我的代码检查在.domain 之后和之前出现在子域中的内容。如果在这种情况下等于 1,则转到与其匹配的任何 URL,依此类推。

到目前为止的代码:

<?php

$host = $_SERVER['SERVER_NAME'];
preg_replace('(?<=-).*?(?=\.)', $host, $matches);
$url = $matches;

switch ($url) 
{ 
case "1": 
header("Location: http://www.website.com/page-here/"); 
break; 

case "test": 
header("Location: http://www.website.com/this-is-a-test/"); 
break; 

case "another": 
header("Location: http://www.website.com/another-page-here/"); 
break; 

default:
header("Location: http://www.website.com");  
break;
} 

?>

如您所见,我有一些案例使用文本,例如“另一个”而不是数字,因为如果我选择在子域中的 - 之后使用文本或数字,我将需要它来工作。

现在的这段代码给了我以下错误:

警告:preg_replace() [function.preg-replace]: 未知修饰符 '.' 在第 4 行的此处

警告:无法修改标头信息 - 标头已由(输出开始于此处的位置:4)在第 22 行再次在该位置发送

我相信上面的第二个错误与默认情况有关。

我真的很感激这方面的任何帮助。我花了很多时间到处搜索代码片段并对其进行测试,但我还没有让它自己工作。

谢谢,彼得

4

1 回答 1

1

你有一个小错误——你使用了 preg_replace 而不是 preg_match。此外,您需要用 / 填充正则表达式。所以应该是:

preg_match('/(?<=-).*?(?=\.)/', $host, $matches);

顺便说一句,你没有提到你是如何让每个尝试访问 *.domain.com 的人都访问 domain.com/redirect.php.,但我假设你正在使用 htaccess 和 RewriteEngine。您可以直接在 RewriteRule 中键入它。

“标头已发送”表示某些输出已发送到浏览器。您是否将文件保存为没有 BOM 的 UTF-8?或者您在重定向之前已经向浏览器打印了一些东西?文件开头也可能有一些杂散的空格....

于 2012-08-28T18:57:55.460 回答