2010-07-12 9 views
1

Salut, je suis mise en place mywebapplication pour donner urls uniques pour les utilisateurs tels que uniquename.mysite.com, anotheuniqname.mysite.com etc.récupérer sous-domaine comme obtenir les types variables

Je veux pouvoir dans un script PHP saisir la partie sous-domaine de l'URL. Serait bien si je peux l'obtenir comme une variable GET - je pense que cela peut être fait avec htaccess. Des idées?

Répondre

1

Ali - ne voulez-vous pas dire une variable $_SERVER comme $_GET serait liée à la chaîne de requête ??

si oui, alors vous pouvez essayer:

$_SERVER['HTTP_HOST'] 

jim

[modifier] - voir http://roshanbh.com.np/2008/05/useful-server-variables-php.html quelques exemples qui peuvent aider

+0

En fait, je configure mon application Web à partir des URL définies lors de la configuration des utilisateurs. Comme mysite.wordpress.com. – Ali

+0

merci anax - oublié les 4 espaces re code :) –

2

Je voudrais essayer ce (au début de votre code PHP):

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

Explication: strrpos find the last oc la garantie de '.' Dans le domaine accédé, substr renvoie ensuite la chaîne jusqu'à cette position. J'ai assigné la valeur de retour à un $_GET var donc vous pouvez l'utiliser comme si c'était un paramètre d'URL normal.

+0

Pour le sous-domaine Sample: 'foo.some-domain.com', le code que vous avez présenté ci-dessus retournerait 'foo.some-domain'. Je pense que tu t'attendais à "foo". –

+0

Cette approche est moins fiable lorsque vous travaillez uniquement avec des domaines de premier niveau (ie - 'some-domain.com'). Utiliser le code ci-dessus sur le domaine exemple: 'some-domain.com', aboutirait à 'some-domain'.Vous pouvez incorporer les 2 lignes suivantes pour évaluer si un sous-domaine existe ou non: 'If ​​(substr_count ($ _ SERVER ['SERVER_NAME'], '.')> 1) { $ sous-domaine = substr ($ _ SERVER ['SERVER_NAME'], 0, strpos ($ _ SERVER ['SERVER_NAME']," . ")); } ' –

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

Pour vous assurer qu'il ya un sous-domaine valide:

$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

Bien mais comment je vérifierais pour m'assurer que l'URL a un sous-domaine? s'il tape simplement dans mysite.com sans un sous-domaine, le code retournerait mysite comme s'il s'agissait d'un sous-domaine. – Ali

+0

Voir ma modification ci-dessus. Les chèques sont plus de 2 points et le premier terme n'est pas www. – robdog

2

Mettez dans votre fichier d'amorçage:

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

Je me demande si vous pourriez écrire 'list ($ _ GET ['subdomain']) = explode (". ", $ _SERVER [" HTTP_HOST "], 2);' Mais la variante substr + strpos est meilleure;) – NikiC

+0

@nikic vous ne pouvez pas, comme explode retourne plus, que juste le sous-domaine, retourne aussi le reste de la chaîne, donc vous aurez besoin de variable temporaire en utilisant cette méthode de toute façon – Maerlyn

+0

votre réponse suppose qu'il a un fichier bootstrap en premier lieu – JM4

0

Si vous voulez vraiment utiliser mod_rewrite dans votre fichier .htaccess, vous pourriez faites quelque chose comme ceci (en supposant que votre script est index.php dans cet exemple):

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

Si vous aviez cela dans votre fichier 'httpd.conf' et non dans un fichier' .htaccess', alors je ne vois pas pourquoi PHP serait plus efficace. Puisque PHP est interprété, et que la plupart des serveurs web sont compilés, je pense que 'mod_rewrite' serait plus efficace. – icktoofay

+0

Je suis enclin à être d'accord avec vous. En supposant qu'il doive le faire dans un contexte par répertoire (basé sur sa formulation), et étant donné qu'il va invoquer le script PHP de toute façon, je ne suis pas sûr que la compilation de l'expression 'mod_rewrite' et l'interne la redirection qu'il est forcé de faire dans cette phase va être plus rapide que le simple traitement des variables dans le script. J'imagine que la différence n'est pas très significative de toute façon. –

+0

votre code contient des erreurs: RewriteCond: impossible de compiler expression régulière '^ [A-Z] + \\ sindex \\. Php. * (? | &) Sous-domaine =' – JM4

0

Voulez-vous quelque chose le long des lignes de:

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

vous pouvez alors obtenir le sous-domaine en utilisant

<?php 

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

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

?> 
0

Cette petite fonction sera simplement obtenir votre « www.website.com » ou dans votre cas " subdomain.website.com ", puis le diviser en 3 parties (0=>"www", 1=>"website", 2=>"com"), puis renvoyer la valeur 1, qui est soit" www "ou le nom de votre sous-domaine.

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

exaple: Si votre site est "admin.website.com", vous recevrez "admin".