2010-08-05 10 views
0

Les URL propres semblent assez simples mais j'ai besoin d'une situation particulière. Je voudrais être en mesure d'inclure le suffixe .html ou rien du tout, mais aucune autre extension:Regex pour les URL propres

 
someurl = pass 
someurl/somepage = pass 
someurl.html = pass 
someurl/somepage.html = pass 

someurl.css = fail 
someurl.exe = fail 
someurl.anyotherextension = fail 
someurl/someother.ext = fail 

Est-ce possible? Devrais-je exclure les extensions que je ne veux pas?

Edit:

Aucune des réponses semblent à ce jour au travail. La seule chose que j'ai découverte par moi-même fonctionne:

^/([\w]*(.html)?)$
mais cela ne fonctionnera pas avec des barres obliques dans l'URL. L'ajout d'une barre oblique à l'intérieur des parenthèses de classes de caractères fait échouer.

Répondre

0

l'option Regex pour les URL propres avec option d'extension .html:

^/([\w\/]*(\.html)?)$

ligne lighttpd.conf complète:

url.rewrite = ("^/([\w\/]*(\.html)?)$" => "index.php?page=$1")

rappel rapide: Les chemins absolus vers des fichiers ou un href de base doit être mis en œuvre toutes les pages qui passent cette regex.

0

Essayez ceci:

(?:^|/)[^./]+(?:\.html)?$ 

Traduction: à partir de la dernière / s'il y a un (ou depuis le début de la chaîne sinon) correspondre à l'une ou plusieurs de quoi que ce soit, sauf / ou ., le cas échéant mis fin par .html.

0
/\.html$|(?:^|.*\/)[^\.]+$/ 

se terminant par ".html" ou n'ont pas de "." depuis le début de l'URL ou le dernier/jusqu'à la fin (vous pouvez avoir des dossiers contenant un ".")

0

Et à ce sujet?

(^[^\.]+?$)|(^.+?\.html$) 

Cela correspond soit une chaîne qui ne contient pas de . ou une chaîne qui se termine par .html.

Ou utiliser, si vous voulez utiliser des points dans vos noms « dossier »:

(^.+?/[^\.]+?$)|(^.+?\.html$) 

correspond soit à une chaîne qui ne contient pas . après la dernière / ou une chaîne qui se termine par .html.

0

Au lieu d'essayer d'utiliser une expression régulière pour correspondre aux URL que vous souhaitez autoriser (comme les autres réponses semblent essayer), utiliser une expression régulière pour correspondre aux URL que vous souhaitez bloquer:

\.(?!html$)[^./]*$ 

Cette regex correspond à l'extension d'une URL, sauf si l'extension est .html. Les URL sans extension ou .html ne correspondent pas. Vos exemples n'incluent pas les URL avec des requêtes (?param=value) ou des fragements (#anchor), de sorte que l'expression régulière n'en tient pas compte. Je suppose également que votre saveur regex prend en charge lookahead.