2010-07-12 50 views
1

嗨,大家好我设立mywebapplication给唯一网址,供用户如uniquename.mysite.com,anotheuniqname.mysite.com等检索子域作为获得可变

我希望能够在一个PHP脚本抓住网址的子域部分。如果我可以将它作为一个GET变量会很好 - 我认为可以用htaccess来完成。有任何想法吗?

回答

1

阿里 - 你不是指$_SERVER变量,因为$_GET会和查询字符串有关吗?

如果是这样,那么你可以尝试:

$_SERVER['HTTP_HOST'] 

吉姆

[编辑] - 看到http://roshanbh.com.np/2008/05/useful-server-variables-php.html几个例子,可以帮助

+0

实际上,我设置了我的Web应用程序,以便在用户设置时从设置的URL中访问。像mysite.wordpress.com一样。 – Ali 2010-07-12 12:02:20

+0

感谢anax - 忘记了4个空格重新编码:) – 2010-07-12 12:29:17

2

我想尝试这个(之初您的PHP代码):

$_GET['subdomain'] = substr($_SERVER['SERVER_NAME'], 0, strrpos($_SERVER['SERVER_NAME'], '.')); 

说明:strrpos找到最后一个oc ''的保证。在访问的域中,substr然后将字符串返回到此位置。我将返回值分配给$_GET var,因此您可以像使用普通的URL参数那样使用它。

+0

对于示例子域:'foo.some-domain.com',您在上面提供的代码将返回'foo.some-domain'。我认为你期待'富'。 – 2011-07-03 11:21:02

+0

当只使用顶级域名(即 - 'some-domain.com')时,此方法不太可靠。使用示例域上面的代码:'some-domain.com',会导致'某个域'。 您可以合并以下两行来评估子域是否存在: $ subdomain =''; ($ _SERVER ['SERVER_NAME'],'。')> 1){sub_main = substr($ _ SERVER ['SERVER_NAME'],0,strpos($ _ SERVER ['SERVER_NAME'],“) 。“)); }' – 2011-07-03 11:22:08

3
$subdomain = substr($_SERVER['HTTP_HOST'], 0, strpos($_SERVER['HTTP_HOST'], '.')); 

为了确保有一个有效的子域:

$urlExplode = explode('.', $_SERVER['HTTP_HOST']); 

if (count($urlExplode) > 2 && $urlExplode[0] !== 'www') { 

    $subdomain = $urlExplode[0]; 

} 
else { 
    // treat as www.mysite.com or mysite.com 
} 
+0

不错,但我将如何检查,以确保该网址有一个子域?如果他只是在没有子域名的情况下输入mysite.com,则代码将返回mysite,就像它是一个子域名一样。 – Ali 2010-07-13 05:31:27

+0

看我上面的编辑。检查是否超过2个点,并且第一项不是www。 – robdog 2010-07-13 07:41:16

2

在引导文件将这个:

$tmp = explode(".", $_SERVER["HTTP_HOST"], 2); 
$_GET["subdomain"] = $tmp[0]; 
+0

我不知道你是否可以编写'list($ _ GET ['subdomain'])= explode(“。”,$ _SERVER [“HTTP_HOST”],2);'但仍然,substr + strpos变种更好;) – NikiC 2010-07-12 12:11:32

+0

@nikic你不能,因为爆炸返回的不仅仅是子域,还会返回字符串的其余部分,因此无论如何你都需要使用这个方法的一些临时变量 – Maerlyn 2010-07-12 12:49:22

+0

你的答案假设他首先有一个引导文件 – JM4 2011-01-27 19:14:06

0

如果你真的想在你的.htaccess文件中使用mod_rewrite,你可以做这样的事情(假设你的脚本在本例中为index.php):

RewriteEngine On 

# Prevent people from going to to index.php directly and spoofing the 
# subdomain value, since this may not be a desirable action 
RewriteCond %{THE_REQUEST} ^[A-Z]+\sindex\.php.*(\?|&)subdomain= 
RewriteRule ^.*$ http://%{HTTP_HOST}/ [R=301,L] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{HTTP_HOST}  !^www 
RewriteCond %{HTTP_HOST}   ^([^\.]+)\.([^\.]+)\.([^\.]+)$ 
RewriteRule ^.*$ index.php?subdomain=%1 
+0

如果你在'httpd.conf'文件中有这个文件,而不是.htaccess文件,那么我不明白为什么PHP会更有效率。由于PHP被解释,并且大多数web服务器都被编译,我认为'mod_rewrite'会更有效率。 – icktoofay 2010-07-13 07:51:16

+0

我倾向于同意你的看法。假设他要在每个目录的环境下完成它(基于他的措词),并且考虑到他将以任何方式调用PHP脚本,但我不确定是否使用了mod_rewrite的表达式编译和内部在这个阶段被迫做出的重定向将比在脚本中处理变量更快。无论如何,我想这种差异不是很重要。 – 2010-07-13 08:33:04

+0

您的代码包含错误:RewriteCond:无法编译正则表达式'^ [A-Z] + \\ sindex \\。php。*(?|&)subdomain =' – JM4 2011-01-27 18:55:44

0

你想沿着线的东西:

RewriteEngine On 
RewriteCond %{HTTP_HOST} ^[a-z0-9-]+\.yoursite\.com$ 
RewriteRule !^index\.php$ index.php [L] 

,那么你可以使用

<?php 

preg_match('/^http:\/\/([a-z0-9-]+)\.yoursite.com$', $_SERVER['HTTP_HOST'], $matches); 

$_GET['username'] = $matches[1]; 

?> 
0

这个小功能将只是获得获得子域的“www.website.com”或你的情况“ subdomain.website.com“,然后将其分成3部分(0=>"www", 1=>"website", 2=>"com"),然后返回值1,即”www“或您的子域名。

function isSubdomain() 
{ 
    $host = $_SERVER['HTTP_HOST']; 
    $host = explode('.',$host); 
    $host = (is_array($host)?$host[0]:$host); 
    return $host; 
} 

的exaple:如果你的网站是 “admin.website.com”,您将收到 “admin”。