8
votes

Apache Rewrite règle menant la barre oblique

premier argument slash: ignoré?

Quelle est la différence de syntaxe entre p> xxx pré>

si je frappe http: // localhost / help , il va à # 1, si je frappe http: // localhost // aidez cela va toujours à # 1. P>

AM I DROITAIRE EN SOIDE DE LA SLASH DE PREMIER DANS LE PREMIER ARGUMENT DE RECRIPRÉDRIBULE est essentiellement ignoré? P>

ADRICHER argument: erreur? h2>

Aussi, pourquoi ne pas fonctionner la règle de réécrire? P>

RewriteRule help /help.php [L]     #1


3 commentaires

Que se passe-t-il si vous changez l'ordre des deux rédreilleurs? Si les premiers matchs (et cela le fait), le second ne se fait pas exécuter.


une raison particulière qui tente d'utiliser des doubles slashes dans une URL?


@Konerak ah oui, tu as raison. @yoda j'essayais simplement d'obtenir la deuxième règle d'appliquer


5 Réponses :


4
votes

Concernant Double Slashes: la plupart des serveurs Web s'effondrent silencieusement de multiples tabas dans une seule barre obliqueque tôt dans le pipeline de traitement de la requête. Cela est vrai pour au moins Apache, Tomcat et Jetty. La plupart des systèmes de fichiers basés sur UNIX fonctionnent de la même manière. Si vous voulez vraiment vérifier cela, vous devez faire quelque chose comme: xxx


0 commentaires

0
votes

La manière dont les travaux de Rewriterle sont que si l'expression régulière donnée correspond à n'importe quelle partie de la partie de chemin de l'URL (la pièce après l'hôte et le port, mais avant la chaîne de requête), la partie de chemin complète est complètement remplacée par celle donnée. substitution. Cela explique le comportement que vous voyez dans la première partie de votre question.

Je ne suis pas sûr de ce qui pourrait causer les 500 erreurs sur la deuxième partie; Peut-être que l'effondrement des barres tables doublées n'arrive pas après la course du moteur de réécriture puis génère une erreur de serveur.


1 commentaires

Notez également que, à moins que vous spécifiez un drapeau de poursuite spécial (que je ne me souvienne pas), de nouvelles règles de réécriture ne sont pas appliquées après avoir trouvé un match; et la correspondance arrive de premier à durer parmi celles spécifiées.



17
votes

assez étrangement, xxx pré>

la règle ci-dessus échoue et ne correspond jamais. p>

Cette règle: p>

RewriteRule   ^/help    /help.php    [PT]


2 commentaires

Il semble que la principale slash correspond effectivement si vous mettez la règle dans la configuration VHOST, mais pas dans un contexte de répertoire.


Fait intéressant, redirectmatch a besoin de la barre oblique de tête dans le motif



-1
votes

La raison de l'erreur 500 est une boucle infinitive:

  • aide est réécrit à / aider
  • / aide se déshabille pour aider
  • aide est réécrit à / aider etc. jusqu'à ce que la limite maxrewites soit touchée -> 500

    alors que si la règle réécrit l'aide à aider, Apache est suffisamment intelligente pour abandonner la réécriture à ce stade.


1 commentaires

Non, c'est en raison de la barre oblique de la destination de la ré-écriture rend le DEST interprété comme une voie absolue à un fichier sur le disque dur, voir ma réponse



3
votes

aide correspond à "Aide" n'importe où sur le chemin.

/ help correspond à rien puisque la directive Rewriterule omet la barre oblique à des fins de correspondance (c'est-à-dire que vous devez utiliser ^ , pas / ou ^ / , pour référencer le répertoire actuel).

(cela peut être très déroutant si vous avez utilisé % {request_uri} dans réécritecond car % {request_uri} commencer par une barre oblique. Lors de la correspondance contre % {request_uri} , ^ et ^ / sont équivalents et un nom de répertoire Toujours être précédé d'un caractère SLASH, que ce soit ou non dans le répertoire de niveau supérieur.)

L'erreur de serveur est causée par une boucle infinie. "Aide" devient "/help.php" qui est ensuite assortie par la même directive qui a réécriture. Donc, après le premier match, "/help.php" devient "/help.php" entraînant infiniment une URL qui ne peut pas être résolue.

Je crois que ces boucles peuvent être corrigées avec le drapeau extrémiser (c.-à-d. [fin] ), mais ce drapeau nécessite Apache 2.3.9, tandis que Apache 2.2 semble être plus courant dans le déploiement. Il serait probablement préférable de réparer toute façon l'expression régulière; ^ help $ semblerait être le meilleur choix ici.


0 commentaires