2008-11-04 8 views
3

Je joue avec lighttpd sur un petit serveur privé virtuel. Je deux domaines pointant vers le serveur. J'utilise la dernière version de lighttpd et mod_evhost sur Ubuntu 8.10.Domaines correspondants avec regex pour lighttpd mod_evhost (www.domain.com/domain.com/sub.domain.com)

  1. Je suis en train de mettre en place une règle telle que si quelqu'un demande domain.com ou www.domain.com ils sont servis à partir /webroot/domain.com/www/

  2. de même, si quelqu'un demande sub.domain.com ils sont servis à partir /webroot/domain.com/sub/

  3. Si les demandes fake.domain.com (où /webroot/domain.com/fake/ n'existe pas) Je les aime servi de /webroot/domain.com/www/

La troisième exigence n'est pas si importante, je peux traiter avec des personnes demandant des sous-domaines qui n'existent pas à partir de la racine du document serveur de /webroot/server.com/www/ même s'ils ont demandé faux. domain.com

J'ai inclus les parties pertinentes de mon fichier lighttpd.conf ci-dessous:

server.document-root = "/webroot/server.com/www/" 

// regex to match sub.domain.com 
$HTTP["host"] =~ "\b[a-zA-Z]\w*\.\b[a-zA-Z]\w*\.\b[a-zA-Z]\w*" { 
    evhost.path-pattern = "/webroot/%0/%3/"  
} 

// regex to match domain.com  
$HTTP["host"] =~ "\b[a-zA-Z]\w*\.\b[a-zA-Z]\w*" { 
    evhost.path-pattern = "/webroot/%0/www/"  
} 

Alors, où vais-je me tromper? À l'heure actuelle, toutes les demandes de * .domaine.com et domain.com sont servis de /webroot/domain.com/www/

Je vous remercie de toute aide que vous avez pu offrir et Si j'ai laissé quelque chose de pertinent s'il vous plaît dites-moi!

Cheers, Rob

+0

J'ai modifié ma réponse pour l'adapter à votre exigence (facultative) n ° 3.Je ne peux pas le tester, alors cela vous dérangerait-il d'essayer si cela fonctionne? – Tomalak

Répondre

5

Vos expressions régulières semblent être un peu exagérées.

Voici ce que j'utiliser:

// regex to match sub.domain.com 
$HTTP["host"] =~ "^[^.]+\.[^.]+\.[^.]+$" { 
    evhost.path-pattern = "/webroot/%0/%3/"  
} 

// regex to match domain.com  
$HTTP["host"] =~ "^[^.]+\.[^.]+$" { 
    evhost.path-pattern = "/webroot/%0/www/"  
} 

où:

[^.]+ matches anything but a dot, 1..n times 

corresponde uniquement des sous-domaines valides avec revenir à "www", vous pouvez utiliser ceci:

// default: route everything to "www" 
$HTTP["host"] =~ "([^.]+\.)?domain\.com$" { 
    evhost.path-pattern = "/webroot/%0/www/" 
} 

// specific regex overwrites "path-pattern" for valid sub-domains only 
$HTTP["host"] =~ "^(valid1|valid2|sub)\.domain\.com$" { 
    evhost.path-pattern = "/webroot/%0/%3/"  
} 
+0

N'est-ce pas une mauvaise habitude de faire une regex qui va correspondre à des caractères URL invalides? – Anders

+0

Il serait trivial de modifier l'expression rationnelle pour correspondre uniquement aux domaines valides. Je vais insérer un autre morceau de code pour illustrer. – Tomalak

+1

En dehors de cela: Si ce code s'exécute, les demandes ont été faites à votre serveur. Ils n'auront très probablement aucun caractère invalide dans leur en-tête d'hôte. – Tomalak

1

Pour votre première, correspondant à domain.com et www.domain.com: ^\b([wW]{3}\.)?[\w\d]*\.com\b$, et pour le second, je ne suis pas sûr si regex peut déterminer si un sous-domaine/page existe, comme c'est le cas pour identifier des chaînes de texte d'intérêt. J'espère que cela vous aidera un peu.

Questions connexes