FAQ: mod_rewrite, 301 redirections et optimisation d'Apache.

(taille = + 4) mod_rewrite (/ taille)

(taille = + 2) Introduction. (/ taille)

Bienvenue sur mod_rewrite, le couteau suisse de manipulation d'URL! Malgré les tonnes d'exemples et de documents, mod_rewrite est vaudou!

Ce module utilise un moteur de réécriture basé sur des règles (basé sur un analyseur d'expressions régulières) pour réécrire les URL demandées à la volée. Il prend en charge un nombre illimité de règles et un nombre illimité de conditions de règle attachées pour chaque règle afin de fournir un mécanisme de manipulation d'URL vraiment flexible et puissant. Les manipulations d'URL peuvent dépendre de divers tests, par exemple des variables de serveur, des variables d'environnement, des en-têtes HTTP, des horodatages et même des recherches de bases de données externes dans différents formats peuvent être utilisées pour obtenir une correspondance d'URL vraiment granulaire.

Ce module fonctionne sur les URL complètes (y compris la partie info-chemin) à la fois dans le contexte par serveur (httpd.conf) et dans le contexte par répertoire (.htaccess) et peut même générer des parties de chaîne de requête sur le résultat. Le résultat réécrit peut entraîner un sous-traitement interne, une redirection de requête externe ou même un débit de proxy interne.

Ce module a été inventé et écrit à l'origine en avril 1996. (1)

(taille = + 2) Comment changer vos URL dynamiques en URL statiques conviviales pour les moteurs de recherche à l'aide de mod_rewrite. (/ size)
SEMrush

Obtenez un exemple de l'URL dynamique et de la façon dont vous le souhaitez. Par exemple

http://www.domain.com/cgi-bin/store.cgi?section=Nintendo&id=4867635&item=Pokemon
et
http://www.domain.com/store/Nintendo/4867635/Pokemon.html

Maintenant que vous avez les deux URL, créez un fichier domain.com/.htaccess commençant par …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase /
RewriteRule ^

Selon le serveur, vous n'aurez peut-être pas besoin des deux premières lignes.

Juste après RewriteRule ^ entrez l'URL statique, puis un $, un espace, puis l'URL d'origine (sans la partie domaine pour les deux URL).

Vous avez maintenant …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase /
RewriteRule ^ store / Nintendo / 4867635 / Pokemon.html $ cgi-bin / store.cgi? Section = Nintendo & id = 4867635 & item = Pokemon

Dans la première URL, le code URL statique, où que l'URL change, remplacez-le par un (. *) (Nintendo, 4867635
et Pokémon dans l'exemple ci-dessus).

Ensuite, après .html, ajoutez un $ et ajoutez un avant le .html
Si vous avez un trait d'union (-) dans la nouvelle URL statique, ajoutez un avant le trait d'union, par exemple …

RewriteRule ^ store – (. *) – (. *) . Html $ cgi-bin / store.cgi? Section = Nintendo & id = 4867635 & item = Pokemon

Si vous n'ajoutez pas le , vous pouvez obtenir un message d'erreur de serveur interne, selon la version des serveurs Apache.

Maintenant, dans la partie statique de l'URL où l'URL change, dans le premier changement, changez-la en $ 1, puis $ 2 et ainsi de suite. Ajoutez ensuite un (L) à la toute fin, avec un espace avant le (L).

Vous avez maintenant …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase /
RewriteRule ^ store / (. *) / (. *) / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 & id = $ 2 & item = 3 (L)

Enregistrez le fichier .htaccess et téléchargez-le sur domain.com/.htaccess et vos URL statiques fonctionneront désormais.
http://www.domain.com/store/Nintendo/4867635/Pokemon.html

Voici quelques autres exemples …

http://www.domain.com/cgi-bin/store.cgi?section=Nintendo&id=4867635
RewriteRule ^ store / (. *) / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 & id = $ 2 (L)

http://www.domain.com/cgi-bin/store.cgi?section=Nintendo
RewriteRule ^ store / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 (L)

http://www.domain.com/cgi-bin/store.cgi
RewriteRule ^ index .html $ cgi-bin / store.cgi (L)

Dans ce dernier exemple, domain.com affichera l'index du script. Si la page ne montre rien, essayez

RewriteRule ^ $ cgi-bin / store.cgi (L)

Avec tous les exemples combinés, vous avez obtenu …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase /
RewriteRule ^ store / (. *) / (. *) / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 & id = $ 2 & item = 3 (L)
RewriteRule ^ store / (. *) / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 & id = $ 2 (L)
RewriteRule ^ store / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 (L)
RewriteRule ^ index .html $ cgi-bin / store.cgi (L)

Remarquez la commande. si vous le répertoriez comme …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase /
RewriteRule ^ index .html $ cgi-bin / store.cgi (L)
RewriteRule ^ store / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 (L)
RewriteRule ^ store / (. *) / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 & id = $ 2 (L)
RewriteRule ^ store / (. *) / (. *) / (. *) . Html $ cgi-bin / store.cgi? Section = $ 1 & id = $ 2 & item = 3 (L)

alors mod_rewrite va paniquer et ça ne marchera pas! Énumérez d'abord la ligne avec le plus de variables, puis la deuxième et ainsi de suite.

(taille = + 2) Puis-je avoir le .htaccess dans un répertoire? (/ taille)

Oui.

Dans l'exemple ci-dessus, pour l'avoir sur domain.com/store/.htaccess, changez le code en …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase / store /
RewriteRule ^ index .html $ /cgi-bin/store.cgi (L)
RewriteRule ^ (. *) . Html $ /cgi-bin/store.cgi?section=$1 (L)
RewriteRule ^ (. *) / (. *) . Html $ /cgi-bin/store.cgi?section=$1&id=$2 (L)
RewriteRule ^ (. *) / (. *) / (. *) . Html $ /cgi-bin/store.cgi?section=$1&id=$2&item=3 (L)

Vous avez déplacé store / up sur la ligne RewriteBase et ajouté / avant cgi-bin. Si le script était dans /store/store.cgi
vous auriez dû stocker / au lieu de cgi-bin / et ensuite vous en débarrasser, pour ressembler à …

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase / store /
RewriteRule ^ index .html $ store.cgi (L)
RewriteRule ^ (. *) . Html $ store.cgi? Section = $ 1 (L)
RewriteRule ^ (. *) / (. *) . Html $ store.cgi? Section = $ 1 & id = $ 2 (L)
RewriteRule ^ (. *) / (. *) / (. *) . Html $ store.cgi? Section = $ 1 & id = $ 2 & item = 3 (L)

L'URL de l'index de la boutique sera domain.com/store/

(taille = + 2) Ack !!! Maintenant, ça gâche le reste de mon site. (/ Size)

Si vous avez par exemple domain.com/index.html, assurez-vous que vos URL mod_rewrited utilisent une autre extension, comme .htm ou .shtml.

(taille = + 2) Les URL de script d'origine n'ont pas le nom du produit dans l'URL. Puis-je ajouter le nom du produit à l'URL? (/ Taille)

Oui! Si vous pouvez modifier le script pour mettre les noms de produits dans l'URL, ou modifier les liens pour les lier, oui, vous le pouvez. Voici un exemple. Notez qu'il y a deux (. *) Et pas 2 $.

RewriteRule ^ (. *) / (. *) . Html $ cgi-bin / file.cgi? Item = $ 1 (L)

Modifiez simplement les liens de script ou les liens de la page statique pour créer un lien vers domain.com/wthing/PRODUCT_NAME.html afin que le nom du produit s'affiche là où le dernier (. *) Se trouve dans le code .htaccess.

(taille = + 2) Mais comment puis-je me débarrasser des caractères spéciaux ou des espaces? (/ taille)

Pour perl, vous pouvez faire des recherches et des remplacements, par exemple …

$ value = ~ s / / _ / g;
$ value = ~ s /? // g;
ou
$ value = ~ s / (^ w d -_.) // g;

qui se débarrasse de presque tout sauf des lettres et des chiffres. Assurez-vous simplement que cela ne change que l'URL et non le contenu. Quant à php ou asp, je ne sais pas comment y faire.

(taille = + 2) Puis-je réécrire un sous-domaine dans un répertoire? (/ taille)

Oui. Voici le code mnemtsas proposé …

xxxxx.domain.com

à

www.domain.com/XXXXXX/

RewriteCond% {HTTP_HOST} ^ (www .) * Xxxxx.domain-name.com (NC)
RewriteCond% {REQUEST_URL}! ^ / XXXXX /.*
RewriteRule ^ (. *) / XXXXX / 1 $ (L)

(taille = + 2) .htaccess augmente-t-il la charge du serveur? (/ taille)

Je ne l'ai pas encore vu augmenter la charge du serveur sur mon serveur dédié. OMI, c'est juste une rumeur. J'ai obtenu environ 30 domaines avec environ 54 lignes dans le fichier domain.com/.htaccess et je ne l'ai jamais vu affecter le serveur. Le seul effet que j'ai jamais obtenu est d'obtenir GoogleBombed (Google grugeant les URL statiques tellement que le serveur tombe en panne ou tombe en panne !!!). Pas de panique. C'est pourquoi vous avez des URL statiques, pour aider les moteurs de recherche à explorer votre site.

Si vous voyez des charges de serveur élevées ou un serveur lent, essayez d'optimiser Apache.

(taille = + 2) Comment optimiser Apache? (/ taille)

Vous devez avoir accès au serveur réel via telnet en tant que root.

Modifiez votre fichier httpd.conf.

Voici les meilleurs paramètres que j'ai trouvés.

Timeout 50
KeepAlive On
MaxKeepAliveRequests 120
KeepAliveTimeout 10
MinSpareServers 10
MaxSpareServers 20
StartServers 16
MaxClients 125
MaxRequestsPerChild 5000

puis redémarrez apache. Même lorsque j'ai des charges de serveur massivement ÉLEVÉES, les sites sont rapides. Une fois, j'ai eu la charge du serveur supérieure à 100, ce qui est extrêmement élevé, et les pages statiques chargées comme si rien n'était élevé !!

Ne me demandez pas comment faire. Si vous ne savez pas ce que vous faites, ne vous en faites pas. Demandez à votre hébergeur. Désordre et vos sites peuvent «mourir» jusqu'à ce qu'il soit réparé! Par exemple, une simple pression sur Retour peut planter vos sites jusqu'à ce que vous reveniez et annuliez le retour, le ramenant à ce qu'il était auparavant.

(taille = + 2) Comment puis-je faire une redirection 301? (/ taille)

sur domain.com/.htaccess

Options + index
Options + FollowSymlinks
RewriteEngine sur
RewriteBase /
RewriteRule ^ quel que soit /(.*)$ http://www.domain.com/$1/ (R = 301, L)
ou
RewriteRule ^ index.htm $ http://www.domain.com/ (R = 301, L)

Le deuxième exemple ne change qu'une URL.

(. *) et $ 1 fonctionnent de la même manière ici que dans mod_rewrite, vous pouvez donc facilement changer beaucoup d'URL avec une seule ligne. Le seul changement avec les redirections et mod_rewrite est le R = 301 (Redirection 301).

(taille = + 2) Conclusion. (/ taille)

Oui, mod_rewrite est vaudou, et cela peut sembler difficile à apprendre, mais ce n'est pas si difficile. Lorsque j'ai essayé pour la première fois de le comprendre, j'ai passé une journée chez apache.org et je n'ai pratiquement pas trouvé où (donc il n'y a qu'un seul lien là comme source de l'introduction.) J'ai ensuite posté sur le tableau Amazon Associate, certains on m'a donné quelques lignes de code, je l'ai changé un peu et avec en un jour, j'ai eu une boutique Amazon entièrement adaptée aux moteurs de recherche en utilisant le script MrRats, et mon hack mod_rewrite, qui comme vous le savez peut-être maintenant, a complètement révolutionné l'Amazonie L'industrie AWS, jusqu'à ce qu'elle rende Google fou! mod_rewrite, si vous avez des URL qui ont?, = ou &, mod_rewrite!