web-dev-qa-db-fra.com

Apache .htaccess mod_rewrite: utilisation de [NC]

Je vois des tonnes d'exemples de .htaccess contenant l'indicateur [NC] (NoCase = insensible à la casse)

Par exemple, la célèbre page h5bp utilise beaucoup le drapeau [NC]:
https://github.com/h5bp/server-configs-Apache/blob/master/dist/.htaccess

Presque tous les exemples placent l'indicateur [NC] à la fin de la directive RewriteCond.
Mais le Documentation officielle indique clairement qu'il n'est utilisé que pour la directive RewriteRule.

99% des exemples sont-ils incorrects?
La documentation officielle est-elle fausse ou incomplète?

4
Gregory MOUSSAT

Mais la documentation officielle indique clairement qu'elle est utilisée uniquement pour la directive RewriteRule.

Les documents ne disent pas qu'il peut niquement ​​être utilisé sur la directive RewriteRulename__. La page vers laquelle vous créez un lien (qui concerne en passant les indicateurs RewriteRulename__) indique simplement:

L'utilisation de l'indicateur [NC] entraîne la correspondance de RewriteRule sans tenir compte de la casse.

Les docs de la directive RewriteCondname__ incluent une section sur les drapeaux pouvant être utilisés avec cette directive. Et ceux-ci incluent NCname__, ORet NVname__. L'indicateur NCest commun aux deux directives.

Si vous avez utilisé un indicateur non valide pour la directive RewriteCondname__, vous obtiendrez une erreur 500 Internal Server. Et si vous examinez le journal des erreurs du serveur, vous devriez voir quelque chose à propos des "drapeaux invalides".

Cependant, (un peu de côté), l'indicateur NCest généralement trop utilisé. Les gens l'incluent souvent par défaut, quand ce n'est vraiment pas nécessaire (ou pire, causera réellement des problèmes).


UPDATE: Je ne sais pas si le document lié a été mis à jour ces dernières années, mais il n'y a que 3 cas d'utilisation de l'indicateur NCavec la directive RewriteCondname__. Les 2 premiers sont certainement justifiés, le 3ème est discutable à l'OMI.

#376   RewriteCond %{HTTP_Host} ^www\.(.+)$ [NC]

Lors de la résolution du nom d'hôte (valeur de l'en-tête Hostname__), il convient de toujours comparer sans tenir compte de la casse (conformément à la spécification HTTP). Tous les navigateurs classiques insèrent l’en-tête Hostlors de la requête. Cependant, d'autres utilisateurs-agents (et bots) peuvent ne pas le faire et mod_rewrite comparera naturellement cette distinction au cas par cas. Cela ne signifie pas nécessairement que vous devriez toujours utiliser l'indicateur NCcar cela dépend de ce que vous faites exactement.

Toutefois, l'indicateur NCest justifié ici car l'objectif de cette règle est de supprimer le sous-domaine wwwname__, qu'il s'agisse de wwwname__, wWwou WWWname__. Sans l'indicateur NCname__, un agent utilisateur (malveillant) pourrait envoyer WWW.EXAMPLE.COM et contourner la redirection canonique vers l'apex du domaine.

#408   RewriteCond %{HTTP_Host} !^www\. [NC]

Notez que ceci est un regex negated (désigné par le préfixe !). Le but de cette règle est de rediriger du sommet du domaine vers le sous-domaine wwwname__. L'indicateur NCest justifié ici, car vous souhaitez empêcher la redirection lorsque l'en-tête Hostcommence par wwwou WWWetc. Sinon, vous pourriez potentiellement obtenir une redirection mal formée telle que www.WWW.example.com.

#564   RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]

L'utilisation de l'indicateur NCest un sujet à débattre IMO. Le but de ce bloc de règles est de bloquer l’accès aux fichiers point et aux répertoires, à l’exception du répertoire .well-known. Dans le meilleur des cas, il est probablement superflu. Cependant, il contredit les conditions similaires utilisées précédemment dans le fichier (lignes n ° 345 à 7) qui n'utilisent pas l'indicateur NCname__.

Le répertoire .well-knowndevrait ​​toujours être en minuscule. Donc, le NCflag devrait ​​être superflu. Cependant, en incluant ici le drapeau NCname__, nous finissons par permettre (ne pas bloquer) les requêtes de la forme .WELL-KNOWN - qui risquent de toute façon d’échouer étant donné que nous sommes probablement sous Linux, qui respecte le casse.

5
MrWhite