2012-08-28 23 views
0

我一直在试图找出近2个小时,现在不能得到它的工作,所以我希望你们中的一些人可以帮助我。请注意我对PHP和正则表达式很新颖。正则表达式解析子域和重定向

好吧,我正在尝试设置一个重定向,它将根据子域中的文本重定向到某些页面。我为我的子域名设置了通配符,现在任何子域名URL都会重定向到包含以下代码的此PHP文件。

所以,如果有人来anytexthere.domain.com他们到达domain.com/redirect.php

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

要做到这一点,我打算使用诸如anythinghere.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替换]: '' 未知的修饰在thelocationhere第4行

警告:不能更改头信息 - 头已经发出(输出开始thelocationhere:4)thelocationagain在线22

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

我真的很感激任何帮助。我花了很多时间搜索代码片段并对它们进行测试,但是我没有完成它自己的工作。

谢谢, 彼得

+0

第二个错误是因为它已经发送了一些东西(第一个错误)。第一个错误是因为你缺少[分隔符](http://us2.php.net/manual/en/regexp.reference.delimiters。PHP)在你的正则表达式(结果是,它假设你的'()'是分隔符,然后不知道如何处理'.')。 – Wiseguy

回答

1

你有一个小错误 - 您使用的preg_replace代替的preg_match的。另外,你需要用/填充你的正则表达式。所以它应该是:

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

顺便说一句,你没有提到你是如何让大家谁尝试,并获得* .domain.com达到domain.com/redirect.php,但我。假设你正在使用htaccess和RewriteEngine。你可以直接在RewriteRule中输入。

“Headers already sent”表示某些输出已发送到浏览器。您是否将文件保存为没有BOM的UTF-8?或者您可能在重定向之前将某些内容打印到了浏览器中? 在文件的开始处也可能有一些杂散空间....

+0

感谢您的快速回复。 * .domain.com到重定向代码是在我的cPanel内完成的。我已经测试了上面给出的正则表达式,但现在它重定向到默认情况下的URL,而不是匹配正则表达式的情况。在这个测试网址examplesubdomain-another.domain.net中,它应该重定向到相应的另一个URL,但它不是。 –

+1

@PeterSullivan'$ matches'是否包含您期望的内容? (提示:否)'$ matches'是一个数组。你可能想'$ url = $ matches [0];'。 – Wiseguy

+0

完美的谢谢你们,现在工作。 –