Question

J'aimerais utiliser le mod rewrite pour convertir les adresses de pages Web telles que / directory en /directory/index.html , dans une situation d'hébergement standard de LAMP. Ce que j'ai travaille pour les adresses qui se terminent par une barre oblique. Je ne parviens pas à gérer les adresses qui ne finissent pas par un slash .

Ce qui semble fonctionner devrait être:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */

Mais la deuxième ligne provoque une erreur de serveur 500. Si j'ajoute une seule lettre x à la deuxième ligne:

rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]

Cela commence à fonctionner, mais uniquement pour les noms de répertoire se terminant par un x . J'ai essayé de remplacer le x avec beaucoup de choses différentes. Tout ce qui est plus compliqué que de vrais personnages (comme [^ x] ou. +) Donne une erreur de serveur 500.

Et pour satisfaire ma propre curiosité, est-ce que quelqu'un sait pourquoi l'ajout d'une seule lettre réelle fait la différence entre une erreur de serveur et une règle qui fonctionne parfaitement?

[Réponse acceptée] Grâce à Gumbo, j'ai pu approximer une solution à l'aide de la réécriture seconde:

rewritecond %{REQUEST_URI} !\.[^/]+$
rewriterule (.+) $1/index.html [L]

Cela fonctionne, mais ne filtre pas seulement .html - cela pourrait bloquer d'autres pages. Malheureusement,

rewritecond %{REQUEST_URI} !\.html$

entraîne une erreur de serveur:

  

La requête a dépassé la limite de 10 redirections internes en raison d'une erreur de configuration probable. Utilisez 'LimitInternalRecursion' pour augmenter la limite si nécessaire.

J'aimerais toujours savoir pourquoi:

rewriterule ^(.*(?!html))$ $1/index.html [L]

résulte en une boucle. La première moitié est censée vérifier si elle ne se termine pas en .html. Depuis la deuxième moitié ajoute .html, cela ressemble à l’équivalent fonctionnel de:

while(substr($address,-4)!='html') $address.='html'

Évidemment, quelque chose me manque.

Était-ce utile?

La solution

Utilisez une directive RewriteCond pour vérifier si le chemin de l'URL ne se termine pas par un .html :

RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]

Modifier & nbsp; & nbsp; & nbsp; Vous utilisez une assertion d'anticipation ( (?!…) ). Mais il n’ya plus rien après . * (seulement un $ ). Alors essayez plutôt une assertion de recherche postérieure:

RewriteRule ^.*$(?<!html) <*>/index.html [L]

Notez cependant que vous avez probablement besoin d'Apache 2.2 pour utiliser ces assertions.

Autres conseils

Eh bien, pour que cela fonctionne réellement, vous pouvez simplement utiliser un aspect négatif au lieu d'un aperçu:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L]

Je ne suis pas sûr de savoir pourquoi l'ajout du 'x' le fait fonctionner, je le modifierai si je le découvre.

Pourquoi ajouter le x pour que cela fonctionne: Si le remplacement correspond à l'expression régulière, la règle RewriteRule sera appliquée à nouveau. Par exemple, cela provoque une erreur:

RewriteRule ^(.*)$ $1.rb

car il remplacerait script par script.rb . Cela correspond à la regex, donc il remplace script.rb par script.rb.rb , encore et encore ...

Ceci est indiqué dans le journal des erreurs:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

Dans votre exemple, vous ajoutez index.html à la fin. Quand il y a un x à la fin de la regex, il ne correspondra pas à votre remplacement, ce qui se terminera par un l .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top