2010-07-12 31 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」。