Exemples d'utilisation de mod_rewrite pour les redirections et la personnalisation cnc. Forcer HTTPS derrière un proxy. Refuser un fichier spécifique

Notions de base et fonctionnalités de Mod_rewrite, exemples de mod_rewrite, variables de serveur, indicateurs ( Indicateurs de règle de réécriture), redirection, refus d'accès par heure du jour ou agent utilisateur, refus d'accès par référent ou en son absence.

Que la paix soit avec vous, frères et sœurs ! A la demande des ouvriers, aujourd'hui je suis ici comme un programme de formation, qui s'appelle Oleg, et aujourd'hui nous allons essayer de nous expliquer, tout d'abord, les principes de base du module miracle mod_rewrite afin d'avoir un une compréhension claire du fonctionnement des conditions et des règles, et pas seulement de stupides copier/coller. Alors, commençons...

Le module mod_rewrite d'Apache est un outil très puissant mais sophistiqué pour manipuler les redirections/transformations/refus d'URL. Presque toutes les conversions / manipulations d'URL côté serveur peuvent être effectuées avec ce module miracle.

Notez que certaines manipulations d'URL ne nécessitent pas un module aussi puissant et complexe (surtout pour les débutants) que mod_rewrite. Pour des tâches simples, vous pouvez utiliser mod_alias. Par le mot "puissant", nous entendons non seulement les larges possibilités de conversion d'URL, mais aussi la consommation accrue de ressources du serveur par rapport aux autres modules.

Mod_rewrite Expressions Régulières

mod_rewrite utilise une expression régulière compatible Perl ( PCRE - Compatible Perl expressions régulières ). Dans cet article, nous ne décrirons pas en détail l'utilisation des expressions régulières ; à mon humble avis, des volumes entiers de livres sont consacrés à ce sujet, et un article ne peut pas couvrir ce sujet.

  • Secrets des expressions régulières : Partie 1. Dialectes et caractéristiques. Écrire des expressions régulières

La principale chose à retenir est que les expressions régulières utilisent Symboles spéciaux (métacaractères) et des caractères normaux ( littéraux). Les principaux métacaractères sont \ / ^ $. | ? * + () (). Les métacaractères doivent toujours être échappés avec une barre oblique inverse "\" - cela fait référence à un espace ("\") ainsi qu'à la même barre oblique inverse ("\\").

N'oubliez pas que mod_rewrite utilise le PCRE d'origine ( Expressions régulières compatibles Perl), mais avec quelques ajouts :

  • "! Condition" (ne correspond pas à la condition)
  • "<Условие " (лексически меньше условия)
  • "> Condition" (lexiquement plus qu'une condition)
  • "= Condition" (lexicalement égal à condition)
  • "-d" (est un répertoire)
  • "-f" (est-ce un fichier normal)
  • "-s" (qu'il s'agisse d'un fichier normal avec une taille non nulle)
  • "-l" (est-ce un lien symbolique)
  • "-F" (vérifier l'existence du fichier via une sous-requête)
  • "-U" (vérifier l'existence de l'URL via une sous-requête)

Comment les règles mod_rewrite sont traitées

L'ordre dans lequel les règles mod_rewrite sont traitées est loin d'être évident. Les règles mod_rewrite sont structurées approximativement dans l'ordre suivant :

RewriteEngine sur RewriteBase / # décommentez cette ligne si le répertoire de la base Web n'est pas root # RewriteBase / you-web-base-dir RewriteCond% (what_ to comparer) with_ what to comparer [flags] RewriteRule source_url target_url [flags]

Maintenant un peu plus en détail :

  • RewriteEngine - il devrait y en avoir un ;
  • RewriteBase - peut être utile lors de l'utilisation de liens relatifs dans les règles, mais si les liens relatifs font référence à la racine du répertoire, alors cette directive ne peut pas être utilisée, théoriquement elle peut être utilisée à plusieurs reprises avant chacune des règles ;
  • RewriteCond - une condition qui doit être remplie avant que la règle ne soit exécutée, il peut y avoir plusieurs conditions ;
  • RewriteRule est la règle elle-même, qui est exécutée lorsque la condition est remplie.

L'ordre dans lequel les règles .htaccess sont placées est important car le moteur de réécriture les gère dans un ordre spécial. Ligne par ligne, les directives RewriteRule sont analysées en premier et si le modèle d'URL correspond ( Modèle, source_url) d'une règle spécifique, les conditions ( Directives RewriteCond) liés à cette règle. Conditions ( RéécrireCond) doit toujours passer avant les règles ( Règle de réécriture) ! En figue. Ce qui suit montre comment les règles mod_rewrite sont traitées.

Comme vous pouvez le voir, l'URL actuelle est d'abord comparée au modèle de règle et, si elle correspond au modèle, elle vérifie les conditions, si l'URL actuelle satisfait aux conditions, la règle et la transformation lui sont appliquées. L'URL va plus loin pour le traitement si le drapeau [L] n'est pas spécifié ( dernier).

L'indicateur [L] doit être utilisé pour chaque règle, à moins bien sûr qu'une autre transformation d'URL ne soit requise.

Mod_rewrite Variables

Les variables serveur peuvent être utilisées dans des conditions (RewriteCond) et dans des règles (RewriteRule).

1. En-têtes HTTP (RqH - En-tête de requête) :

  • HTTP_USER_AGENT - contient ligne complète header "User-Agent :" ;
  • HTTP_REFERER - l'adresse d'où vient l'utilisateur ;
  • HTTP_COOKIE - accès à la liste des COOKIES du navigateur ;
  • HTTP_FORWARDED Contient l'adresse IP du serveur proxy ou d'équilibrage de charge.
  • HTTP_HOST est l'adresse hôte/serveur demandée par l'utilisateur, par exemple, example.com ;
  • HTTP_PROXY_CONNECTION - contient le jeton de connexion ( jeton de connexion) "close" ou "Keep-Alive", destiné à négocier des connexions persistantes entre le client et le serveur (analogue à l'en-tête Connection);
  • HTTP_ACCEPT est un en-tête de négociation de contenu qui prend en charge le navigateur/client de l'utilisateur, par exemple, "text/html, application/xhtml + xml, application/xml; q = 0.9, */*; q = 0.8" ("type / subtype" , séparés par des virgules où type est le type de contenu et sous-type est le qualificateur de type.). Si l'en-tête Accept contient "Accept: * / *" (* / *), alors le client est prêt à accepter tout type de contenu.

2. connexion et demande :

  • REMOTE_ADDR - adresse IP du client ;
  • REMOTE_HOST - Nom DNS de l'adresse IP du client ;
  • REMOTE_PORT - numéro de port client actuel ;
  • REMOTE_USER - contient le nom de l'utilisateur autorisé (au moyen du serveur);
  • REMOTE_IDENT - la variable ne sera définie que si le module mod_ident est connecté et IdentityCheck est défini sur "on", il est conçu pour fonctionner avec le protocole Ident https://ru.wikipedia.org/wiki/Ident ;
  • REQUEST_METHOD - la méthode par laquelle la demande a été faite, GET | GET | HEAD, etc.;
  • SCRIPT_FILENAME - chemin complet vers le fichier demandé, par exemple /var/www/public_html/script_name.php ;
  • PATH_INFO - Contient le chemin d'accès fourni par l'utilisateur qui apparaît après le nom du script mais avant la chaîne de requête (?). Par exemple, si le script a été demandé à l'URL http://www.example.com/php/path_info.php/some/stuff?foo=bar, alors la variable $ _SERVER ["PATH_INFO"] contiendra / some / truc.
  • QUERY_STRING - une chaîne de requête GET, si l'adresse demandée est http://example.com/index.php?var=1&var=2, alors QUERY_STRING contiendra var = 1 & var = 2; AUTH_TYPE - type d'authentification, si authentification HTTP est effectuée, elle peut être Basic ou Digest.

3.internes du serveur (serveurs internes) :

  • DOCUMENT_ROOT - chemin complet vers le répertoire personnel de l'utilisateur, par exemple / var / www / public_html /
  • SERVER_ADMIN - données de l'administrateur du serveur / virtual_host, généralement une adresse e-mail ;
  • SERVER_NAME est le nom du serveur, généralement issu de la directive ServerName ;
  • SERVER_ADDR - adresse IP du serveur ;
  • SERVER_PORT - port du serveur ;
  • SERVER_PROTOCOL - version du protocole utilisé, par exemple HTTP/1.0 ou HTTP/1.1 ;
  • SERVER_SOFTWARE - nom/version du serveur.

4.date et heure (système, date et heure) :

  • TIME_YEAR - année, 2014
  • TIME_MON - mois, 05
  • TIME_DAY - jour, 07
  • TIME_HOUR - heure, 04 (24)
  • TIME_MIN - minutes, 38
  • TIME_SEC - secondes, 55
  • TIME_WDAY - jour de la semaine, 3 (mercredi)
  • TIME - au format année-mois-jour-heure-min-sec, par exemple 20140514234534

5.spéciaux :

  • API_VERSION - au format "20051115 : 33"
  • THE_REQUEST - détails de la requête GET / POST, par exemple "GET /index.html HTTP / 1.1"
  • REQUEST_URI - URL relative de la requête "/index.html"
  • REQUEST_FILENAME - chemin local complet vers un fichier ou un script dans système de fichiers demande correspondante
  • IS_SUBREQ - si une sous-requête est exécutée, alors la variable contient vrai, sinon faux
  • HTTPS - activé/désactivé si HTTPS est utilisé/non utilisé

6.variables du résultat d'exécution :

  • 1 $ - 1 $, 2 $, etc. généré lorsque (pattern1. *) (pattern2. *) correspond à RewriteRule
  • % 1 -% 1,% 2, etc. généré lorsque (pattern1. *) (pattern2. *) correspond à RewriteCond
  • Vous pouvez en savoir plus sur les en-têtes HTTP dans la spécification rfc2616 Hypertext Transfer Protocol - HTTP / 1.1

Indicateurs Mod_rewrite

Pour contrôler le comportement des conditions ( RéécrireCond) et les règles ( Règle de réécriture) mod_rewrite utilise des drapeaux [flags].

  • [B] ( échapper aux références arrière) - vous oblige à échapper (encoder) les caractères spéciaux, par exemple, prenez la règle "RewriteRule ^ search /(.*)$ /search.php?term=$1" qui contient une chaîne de recherche pouvant contenir, par exemple, " x & y / z " et par conséquent la chaîne " search.php? term = x & y / z " sera renvoyée, ce qui n'est pas une URL valide et sera convertie par le navigateur en " search.php? term = x% 20 & y% 2Fz = ". Avec le drapeau [B], la chaîne sera convertie en "/search.php?term=x%20%26%20y%2Fz". Pour que cet exemple fonctionne, vous devez définir AllowEncodedSlashes sur On car httpd par défaut ne vous permet pas d'encoder les barres obliques dans l'URL
  • [C] chaîne- combiner plusieurs règles en une chaîne. Si la première règle de la chaîne ne remplit pas les conditions, alors toute la chaîne sera ignorée.
  • biscuit- définit un cookie dans le format, les paramètres pour secure et httponly sont définis sur true | false
  • supprimer les informations du chemin- supprime le PATH_INFO dans le lien converti, utile dans les cas où PATH_INFO a déjà été ajouté dans la conversion précédente
  • [E] env- définir une variable ou la supprimer
  • [F] interdit- renvoie l'erreur 403
  • [G] disparu- renvoie l'erreur 410
  • [H] gestionnaire- installe de force un gestionnaire pour certains types de fichiers, par exemple, la règle "RewriteRule! \. -" forcera tous les fichiers sans extension à passer par PHP
  • [L] dernier- indique que la règle est la dernière et que le processus de transformation ultérieur est terminé
  • [N] Suivant- démarre le processus de conversion à partir de la première règle dans l'ordre, utilisez ce drapeau avec prudence car il peut conduire à une boucle fermée (dite boucle)
  • aucun cas- désactive la vérification de la casse
  • pas de fuite- mod_rewrite applique généralement des règles d'échappement d'URI au résultat de la conversion. Les caractères spéciaux (tels que "%", "$", ";", etc.) seront échappés avec leur hexadécimal ( code hexadécimal) substitutions ("% 25", "% 24" et "% 3B", respectivement). Ce drapeau interdit de le faire.
  • nosubreq- ignorer les sous-requêtes, exécuter la règle uniquement pour les requêtes réelles/directes
  • [P] Procuration- Apache fait une sous-requête à la page spécifiée à l'aide du module de programme mod_proxy, et le client ne saura rien de cette sous-requête. Une erreur se produira si le module mod_proxy n'est pas connecté
  • traverser- arrêter la conversion et transmettre le nouveau lien reçu plus loin
  • qsappend- ajoute des paramètres de requête originaux ( chaîne de requête) être remplacé. Si aucun nouveau paramètre de requête n'est inclus dans la recherche, les paramètres de requête d'origine seront ajoutés automatiquement. Si les nouveaux paramètres sont inclus dans la substitution, les paramètres de requête d'origine seront perdus si l'indicateur QSA n'est pas spécifié
  • [R] réorienter- renvoie la commande de redirection vers le navigateur ( le code par défaut est 302 - MOVED TEMPORARY), vous pouvez spécifier vous-même le code de redirection, par exemple R = 301 ( code 301 - DEPLACEMENT PERMANENT), mais dans la plage de 300 à 399, sinon la règle ne sera pas traitée
  • [S] sauter- saute la règle suivante si cette règle a été déclenchée. Vous pouvez spécifier le nombre de règles, par exemple : S = 2
  • [T] taper- définit de force le type MIME du fichier cible. Par exemple, "RewriteRule \ .pl $ -", cette règle mappera les scripts Perl sur format de texte, ce qui signifie que le code du script sera envoyé au navigateur.

En savoir plus sur les drapeaux dans l'original :

Protocoles autorisés dans mod_rewrite

mod_rewrite définira l'URL générique comme externe si l'un des protocoles suivants est spécifié :

  • ajp : // - Protocole Apache JServ
  • équilibreur : // - Équilibreur de charge Apache
  • ftp : // - Protocole de transfert de fichiers
  • gopher: // - Gopher (protocole)
  • http: // - Protocole de transfert hypertexte
  • https : // - Protocole de transfert hypertexte sécurisé
  • ldap : // - Protocole d'accès au répertoire léger
  • nntp : // - Protocole de transfert de nouvelles sur le réseau
  • LDAP : - Protocole léger d'accès aux répertoires
  • mailto : - Le schéma d'URI mailto
  • actualités : - Protocole d'actualités

.htaccess et ordre de placement des règles

Dans le fichier .htaccess, théoriquement, les directives peuvent être spécifiées au hasard, à l'exception des directives liées à rewrite_module. Néanmoins, il vaut mieux suivre une certaine séquence :

  1. directives CENTRALES ;
  2. Paramétrage des modules.

Les directives rewrite_module qui effectuent la redirection, et non la conversion, doivent être les premières, sinon, après la conversion de la requête, la redirection souhaitée risque de ne pas se produire si l'on ne prend pas en compte les conversions précédentes.

Exemples de règles mod_rewrite

Refuser l'accès avec mod_rewrite

RewriteCond% (TIME_HOUR)% (TIME_MIN)> 2000 RewriteCond% (TIME_HOUR)% (TIME_MIN)<0700 RewriteRule .* - [ F ] # OR RewriteCond %{TIME_HOUR} >= 20 RewriteCond% (TIME_HOUR)<07 RewriteRule .* - [ F ]

Cette règle fermera l'accès de 20h à 7h. L'exemple ci-dessus spécifiquement pour les amateurs de copier/coller contient une erreur de syntaxe délibérée, HTTP 500 ( erreur du serveur), ce qui entraînera une entrée dans le journal des erreurs RewriteRule : délimiteurs d'indicateurs incorrects. Cela se traduit par un séparateur d'indicateurs incorrects - au lieu de [F], vous devez utiliser [F], c'est-à-dire évitez les espaces et autres séparateurs sauf virgule !

2. Nous interdisons fermement au bot WBSearchBot de toucher notre site :

RewriteCond% (USER_AGENT) WBSearchBot RewriteRule. * - [F] # Alternativement, au lieu de l'erreur 403 (INTERDIT), envoyez l'erreur 404 (NON TROUVÉE) RewriteCond% (USER_AGENT) WBSearchBot RewriteRule. * -

Bien que, en modifiant légèrement la règle, vous pouvez c.t. transférez les flèches à quelqu'un d'autre, pour ainsi dire, placez le bot sur un autre site, disent-ils ... êtes-vous, ofonarel !? Allez vous entraîner, là-bas, dessus... :)) (extrait de l'opération X/F "Y" ​​et autres aventures de Shurik) :

Règle de réécriture. * Http://kremlin.ru

WBSercheBot ( Mozilla / 5.0 (compatible ; WBSearchBot / 1.1 ; + http://www.warebay.com/bot.html)) est un bot plutôt agressif et vous pouvez vous en débarrasser en toute sécurité.

# BLOCK POST DEMANDE POUR L'ANCIEN PROTOCOLE HTTP ... RewriteCond% (THE_REQUEST) ^ POST RewriteCond% (HTTP_REFERER)! ^ Http(s)?: // (www \. | Www1 \.)? Example.com RewriteCond% (THE_REQUEST) POST (. *) HTTP / (0 \ .9 | 1 \ .0) RewriteCond% (HTTP_USER_AGENT) ^ $ RewriteRule. * -

Dans l'exemple précédent, le code de réponse 303 See Other n'a pas été spécifié par hasard - le fait est que si la méthode de redirection ( généralement GET) diffère de la méthode de requête ( par exemple POST), alors si les codes de réponse 301-302 sont renvoyés, au lieu d'une redirection automatique, une page avec un lien pour la navigation manuelle s'affichera dans le navigateur ! Dans le cas de la réponse 303 Voir Autre, la redirection est effectuée automatiquement par la méthode GET, quelle que soit la méthode de requête.

4. Protection des hotlinks - nous interdisons l'affichage de nos images à partir d'autres sites :

# # PROTÉGER LES HOTLINK ... # http://www.htaccesstools.com/hotlink-protection/ RewriteCond% (HTTP_REFERER)! ^ $ RewriteCond% (HTTP_REFERER)! ^ Http(s)?: // (www \. | Www1 \.)? RewriteCond site% (HTTP_REFERER)! ^ Http(s)?: // ( www \.)? google.com RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \.)? yandex.ru RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \ .) ?subscribe.ru RewriteCond% (HTTP_REFERER) ! ^ http(s) ? : // (www \.) ? feedburner.com RewriteCond% (HTTP_REFERER) ! ^ http(s) ? : // (www \.) ? mail.ru RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \.)? poisk.ru RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \.)? rambler .ru RewriteCond% (HTTP_REFERER) ! ^ http(s) ? : // (www \.) ? nigma.ru RewriteCond% (HTTP_REFERER) ! ^ http(s) ? : // (www \.) ? ask.com RewriteCond% (HTTP_REFERER)! ^ Http(s)?: // (www \.)? Qip.ru RewriteCond% (HTTP_REFERER)! ^ Http(s)?: // (www \.)? Ukr.net RewriteCond% (HTTP_REFERER)! ^ Http(s)?: // (www \.)? Conduit.com RewriteCond% (HTTP_REFERER)! ^ Http(s)?: // (www \.)? Tut.by RewriteCond% (HTTP_REFERER )! ^ http(s)?: // (www \.)? bing.com RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \.)? web alta.ru RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \.)? yahoo.com RewriteCond% (HTTP_REFERER)! ^ http(s)?: // (www \.)? conduit. com RewriteRule \. (jpg | jpeg | png | gif) https://dl.dropboxusercontent.com/u/52572427 / \ images / wrs-hotlink-deny .jpg

  • RewriteRule ^ - RewriteCond% (HTTPS) sur RewriteRule ^ - # Pour rediriger tous les utilisateurs pour accéder au site AVEC le "www." préfixe, # (http: //example.com / ... sera redirigé vers http: //www.example.com / ...)# Décommentez ce qui suit : RewriteCond% (HTTP_HOST). RewriteCond% (HTTP_HOST) ! ^ Www \. RewriteRule ^ http% (ENV: protossl): //www.% (HTTP_HOST)% (REQUEST_URI) # OU # REDIRECT FOR / DOCS Redirection permanente / docs http://docs.example.com

    2. Rediriger nos flux RSS / ATOM vers FeedBurner

    # REDIRECTION du blog RSS/ATOM vers FeedBurner... RewriteCond% (HTTP_USER_AGENT)! ^. * (FeedBurner | FeedValidator) RewriteCond% (QUERY_STRING) ^ option = com_content & view = vedette & Itemid = () + & format = feed RewriteRule index.php http://feeds.feedburner.com /remote-shaman-blog ? # # REDIRECTION du forum RSS/ATOM vers FeedBurner... # si HTTP_USER_AGENT n'est pas FeedBurner ou FeedValidator RewriteCond% (HTTP_USER_AGENT) ! ^. * (FeedBurner | FeedValidator) # forum/sujets/mode-sujets? format = flux # forum / sujets / mode-latest? format = flux # forum / sujets / messages? format = flux# forum / recent? format = flux RewriteCond% (QUERY_STRING) ^ format = flux $ RewriteRule forum / (* /)? () + http://feeds.feedburner.com/remote-shaman-forum?

    Veuillez noter qu'à la fin de chaque lien dans les règles ( Règle de réécriture) il y a un symbole "?" - il est obligatoire pour que les paramètres QUERY_STRING ne soient pas ajoutés à la fin du lien vers lequel la requête sera redirigée ! si vous ne spécifiez pas le symbole "?", alors à la fin la redirection se fera vers l'adresse http: //feeds.feedburner.com/remote-shaman-blog? option = com_content & view = featuring & Itemid = .. . et http://feeds.feedburner.com / remote-shaman-forum?format = feed respectivement.

    Résultats

    mod_rewrite est un outil puissant et vous pouvez faire des merveilles avec - c'est un fait ! Il n'y a pas beaucoup d'exemples dans cet article, mais il y en a beaucoup sur le réseau, mais il n'y a pratiquement pas de matériel sur ce qui est quoi et pourquoi dans le style comme pour les idiots complets. D'autres exemples d'utilisation de mod_rewrite seront probablement ajoutés plus tard sur cette page.

    Dans cet article, j'ai essayé d'expliquer le plus clairement possible (j'espère avoir réussi) les principes de base du module miracle mod_rewrite, dans un style comme pour les idiots complets (dans le bon sens du terme ;), à mon humble avis de ma propre expérience Je sais combien il est parfois difficile de maîtriser quelque chose avec zéro et quand le mana et les principes de ce quelque chose sont décrits dans des phrases générales vagues et des termes profondément techniques.

    Lors de la rédaction de ce matériel, seul le mana original du site httpd.apache.org a été utilisé (pas de copier/coller). Si j'ai raté quelque chose ou manqué quelque chose, assurez-vous de l'écrire dans les commentaires.

RewriteRule définit les règles du moteur de réécriture

Syntaxe: Substitution de modèle de règle de réécriture(exemple, RewriteRule ^ tags $ /tags.php [L] )

En substitution, vous pouvez utiliser, entre autres, des drapeaux spéciaux en ajoutant la construction suivante :

Comme troisième argument de la directive RewriteRule. Les indicateurs sont une liste d'indicateurs séparés par des virgules :

  • "redirect | R [= code]" (provoque une redirection)

Le préfixe dans la Substitution de la forme http: // thishost [: thisport] / (qui crée une nouvelle URL à partir d'un URI) déclenche une redirection externe (redirect). S'il n'y a pas de code dans la substitution, la réponse sera avec le statut HTTP 302 (TEMPORARILY MOVED). Si vous souhaitez utiliser d'autres codes de réponse dans la plage 300-400, écrivez-les simplement sous forme de nombre ou utilisez l'un des noms symboliques suivants : temp (par défaut), permanent, seeother. Utilisez ceci dans les directives qui doivent convertir certaines URL virtuelles en URL réelles et les renvoyer au client, par exemple, convertir "/ ~" en "/ u /" ou toujours ajouter une barre oblique à / u / user, etc.

Remarque : lorsque vous utilisez cet indicateur, assurez-vous que le champ de recherche est une URL valide ! Sinon, vous redirigez vers nulle part ! Et rappelez-vous que ce drapeau par lui-même ajoute uniquement à l'URL la chaîne http: // thishost [: thisport] / et le processus de conversion continue. De plus, vous souhaitez généralement arrêter et effectuer cette redirection immédiatement. Pour arrêter le processus de conversion, vous devez également écrire le drapeau "L".

  • "interdit | F" (rend l'URL interdite)

Cela rend l'URL actuelle interdite, par exemple, une réponse avec le statut HTTP 403 (FORBIDDEN) est immédiatement envoyée au client. Utilisez cet indicateur en conjonction avec les RewriteConds appropriés pour bloquer les URL en fonction de certains critères.

  • "Gone | G" (rend l'URL "morte")

Ce drapeau rend l'URL actuelle "morte", c'est-à-dire qu'une réponse HTTP avec un statut 410 (GONE) est immédiatement envoyée. Utilisez ce drapeau pour marquer les pages mortes qui n'existent plus.

  • "proxy | P" (appelle un proxy)

Cet indicateur marque la partie générique comme une demande de proxy interne et la transmet immédiatement (c'est-à-dire que le processus de conversion s'arrête ici) via le module proxy. Vous devez vous assurer que la chaîne de substitution est un véritable URI (par exemple, commençant généralement par http:// hostname) qui peut être proxy par le module Apache. Si ce n'est pas le cas, vous obtiendrez une erreur du module proxy. Utilisez cet indicateur pour obtenir une implémentation plus puissante du dirketiv ProxyPass qui intègre du contenu sur des serveurs distants dans l'espace de noms du serveur local.

Remarque : pour l'utiliser, assurez-vous d'avoir un module proxy fonctionnel sur votre serveur Apache. Si vous ne le savez pas, vérifiez s'il y a une ligne mod_proxy.c dans la sortie "httpd -l". Si c'est le cas, ces capacités sont disponibles pour mod_rewrite. Sinon, vous devez d'abord reconstruire le programme "httpd" avec le module proxy activé.

  • "dernier | L" (dernière règle)

Arrêtez le processus de conversion à ce stade et n'appliquez aucune autre règle de conversion. Cela correspond à la dernière instruction en Perl ou à l'instruction break en C. Utilisez cet indicateur pour éviter de convertir l'URL actuelle en d'autres règles de conversion qui suivent. Par exemple, utilisez ceci pour convertir l'URL racine de ("/") en une vraie, telle que "/ e / www /".

  • "suivant | N" (tour suivant)

Redémarrez le processus de transformation (en commençant par la première règle). Dans ce cas, l'URL est à nouveau mise en correspondance avec certaines conditions, mais pas l'URL d'origine, mais l'URL issue de la dernière règle de conversion. Cela correspond à l'instruction suivante en Perl ou à l'instruction continue du langage C. Utilisez cet indicateur pour redémarrer le processus de conversion, c'est-à-dire pour sauter inconditionnellement au début de la boucle.

Attention toutefois à ne pas boucler sans fin !

  • "chaîne | C" (reliant à la règle suivante)

Ce drapeau lie la règle actuelle à la suivante (qui, à son tour, peut se lier à la suivante, etc.). Cela a l'effet suivant : s'il y a une correspondance pour la règle, le processus continue comme d'habitude, c'est-à-dire que le drapeau n'a aucun effet. Si la règle ne correspond pas à la condition, toutes les règles associées suivantes sont ignorées. Par exemple, utilisez ceci pour supprimer la partie ".www" dans la règle de configuration du contexte d'un répertoire en cours d'exécution lorsque vous autorisez les redirections externes (où ".www" ne devrait pas être !).

  • "type | T = type MIME" (forcer le type MIME)

Forcez le type MIME du fichier cible à être le type MIME. Par exemple, cela peut être utilisé pour imiter la directive mod_alias ScriptAlias ​​​​qui force tous les fichiers du répertoire mappé à avoir un type MIME de "application / x-httpd-cgi".

  • "nosubreq | NS" (utilisé uniquement en cas de sous-requête non interne)

Cet indicateur indique au rewriter d'ignorer la directive si la sous-requête actuelle est une sous-requête interne. Par exemple, des sous-requêtes internes dans Apache se produisent lorsque mod_include essaie d'obtenir des informations sur les fichiers par défaut possibles pour les répertoires (index.xxx). Avec les sous-requêtes, cela n'est pas toujours utile et pose même parfois un problème dans le fonctionnement de l'ensemble des directives de transformation. Utilisez cet indicateur pour exclure certaines règles.

Utilisez la règle suivante comme bon vous semble : chaque fois que vous préfixez certaines URL et que vous les transmettez au script CGI pour traitement, il y a de fortes chances que vous rencontriez des problèmes (ou même une surcharge inutile) lors de l'utilisation de sous-requêtes. Dans ces cas, utilisez ce drapeau.

  • "nocase | NC" (insensible à la casse)

Cela rend le modèle insensible à la casse, c'est-à-dire qu'il n'y a pas de différence entre "A-Z" et "a-z" lorsque le modèle est appliqué à l'URL actuelle.

  • "qsappend | QSA" - Ajout d'une chaîne de requête

Cet indicateur indique au moteur de réécriture d'ajouter, plutôt que de remplacer, une chaîne de requête d'une URL à une chaîne existante dans la chaîne de recherche. Utilisez-le lorsque vous souhaitez ajouter des données supplémentaires à la chaîne de requête à l'aide de directives de transformation.

Un exemple sur learnsongs.ru :

RewriteRule ^ tags / ([- A-Za-z0-9 _ ’] +) $ /tags.php?tag=$1

RewriteRule ^ tags / ([- A-Za-z0-9 _ ’] +) ? Page = (+) $ /tags.php?tag=$1&page=$2

  • "noescape | NE" (ne pas échapper à l'URI lors de la sortie)

Cet indicateur empêche mod_rewrite d'appliquer des règles d'échappement d'URI normales au résultat de la conversion. Typiquement, les caractères spéciaux (tels que "%", "$", ";", et ainsi de suite) seront échappés avec leurs substitutions hexadécimales ("% 25", "% 24" et "% 3B", respectivement); ce drapeau vous en empêche. Cela permet aux caractères de pourcentage d'apparaître dans la sortie, comme dans

RewriteRule /foo/(.*) / bar?Arg = P1 \% 3d $ 1

Pour quel "/foo/zed" serait converti en une requête sûre "/ bar? Arg = P1 = zed".

  • "passthrough | PT" (passer par le gestionnaire suivant)

Cet indicateur indique au moteur de transformation de définir le champ uri de la structure interne request_rec sur le champ de nom de fichier. Ce drapeau est juste une astuce astucieuse pour pouvoir gérer la sortie des directives RewriteRule, des directives Alias, ScriptAlias, Redirect, etc. d'autres traducteurs nom de fichier URI. Un exemple trivial pour montrer cette sémantique : si vous voulez convertir / abc en / def en utilisant le moteur de conversion mod_rewrite puis / def en / ghi en utilisant mod_alias :

RewriteRule ^ / abc (. *) / Def $ 1

Alias ​​/ def / ghi

Si vous omettez l'indicateur PT, mod_rewrite fait le travail très bien, c'est-à-dire qu'il convertit uri = / abc / ... en nom de fichier = / def / ... comme devrait le faire un traducteur de nom de fichier URI entièrement compatible avec l'API. Ensuite, c'est au tour de mod_alias d'essayer de faire la transition URI-nom de fichier qui ne fonctionnera pas.

Remarque : vous devez utiliser cet indicateur si vous souhaitez mélanger des directives de différents modules contenant des traducteurs vers URL-filename. Un exemple typique est l'utilisation des modules mod_alias et mod_rewrite ..


Exemples d'entrées dans htaccess : Fichier d'index, Redirection avec préservation des notes pages, collage www et http, Création CNC ou vers Human UnderstandingUrls, Rediriger tous les fichiers d'un dossier vers un seul fichier, Protection contre hotlinkov, Définition encodages et beaucoup plus!

Nous indiquons le fichier d'index (qui est le premier à s'ouvrir lors de l'accès au site)

Index de répertoire index.php index.html index.shtml
Un ou plusieurs fichiers peuvent être spécifiés

Redirection php htaccess

Redirection / http://www.newsite.ru/
Redirection globale (premier /) nous envoyons TOUT à la nouvelle adresse http://www.newsite.ru/

Redirection / katalog http://www.newsite.ru/newkatalog
Tous les appels à catalogue rediriger vers le domaine sitenews.ru sectionner nouveaukatalog

Redirection avec préservation du page rank

Redirection 301 /old/old.php http://www.votresite.ru/new.php
vieille est un exemple d'un ancien chemin de page. Nouveau- un exemple de nouveau chemin de page.

Rediriger un utilisateur avec une IP spécifique

SetEnvIf REMOTE_ADDR 192.100.220.1 REDIR = "redir"
RewriteCond% (REDIR) redirection
RewriteRule ^ / $ /out.html
Un utilisateur spécifique (il est fatigué ou a besoin d'être envoyé à la section interne) avec l'ip donnée est redirigé vers la page /out.html

Coller www et http htaccess php

Déjà de nombreux référenceurs (promotion et optimisation) savent que pour les moteurs de recherche les URL avec/sans www- ce sont des adresses différentes et la disponibilité d'un site avec www affecte négativement l'indexation et le classement. Par conséquent, le référencement demande souvent aux développeurs de coller le site sans www(de sorte que lors de l'accès au site depuis www, il y a un transfert vers sans www, c'est-à-dire uniquement http)

Moteur de réécriture activé
RewriteCond% (HTTP_HOST) ^ www.votresite \ .ru $
RewriteRule ^ (. *) $ Http://votresite.ru/$1
Maintenant, même si vous tapez dans la barre d'adresse www.votresite.ru, alors le serveur vous enverra à http://votresite.ru

Création d'une CNC ou d'URL lisibles par l'homme htaccess php

RewriteEngine activé
RewriteRule ^ article /( [^/\.†+)/?$ article.php? Id = 1 $ [L]
Après avoir ajouté cette ligne à .htaccess il y aura deux adresses disponibles pour le document. Par exemple: et www.votresite.ru/article/1

RewriteEngine activé
RewriteRule cat /(.*)/(.*)/$ /art.php?$1=$2
Par conséquent www.votresite.ru/art.php?type=123 se transforme en www.votresite.ru/cat/type/123/:

Voici quelques options plus privées :

RewriteEngine activé
RewriteRule katalog-saitov [/] * $ article.php? Id = $ 1 [L]
Article avec une adresse technique www.votresite.ru/article.php?id=1 sera désormais disponible avec son propre nom lisible par l'homme www.votresite.ru/katalog-saitov.

Rediriger tous les fichiers d'un dossier vers un seul fichier

Par exemple, vous n'avez plus besoin de la section articles de votre site et souhaitez rediriger toutes les requêtes vers le dossier /articles vers un seul fichier /non-articles.php. Le code ci-dessous vous aidera

RewriteRule ^ articles (. *) $ /Non-articles.php

Protection des liens Htaccess php

Peut-être connaissez-vous cette option lorsque les images ne sont pas téléchargées sur le serveur, mais qu'un simple lien vers le site est utilisé. En conséquence, une charge supplémentaire de trafic est créée pour le site propriétaire de l'image. Nous utilisons le code ci-dessous

Moteur de réécriture activé
# Dans la lignée de ? Yoursite\ .ru/ changez cette construction en URL de votre site
RewriteCond% (HTTP_REFERER) ! ^ Http : // (. + \.) ? Votresite \ .ru/
RéécrireCond% (HTTP_REFERER) ! ^ $
# Remplacez /images/exit.jpg par une autre image. Peut être indécent
RewriteRule. * \. (Jpe? G | gif | bmp | png) $ /images/exit.jpg [L]

Détection de l'encodage php Htaccess

Options supplémentaires pour les encodages les plus populaires : UTF-8, Windows-1251, KOI8-R... Regardons l'UTF-8 le plus courant dans les exemples.
AddDefaultCharset UTF8 # encodage de fichier, dans lequel les documents sont envoyés par défaut
AddCharset UTF8 .html # Exemple : traite le html dans l'encodage donné
AddCharset UTF8 * # Exemple : traite tous les fichiers dans cet encodage

# Traitement dans l'encodage donné d'un fichier spécifique

AddCharset UTF8 .html

CharsetDisable On # Annule le ré-encodage des fichiers téléchargés par le serveur
CharsetDefault UTF8 # Encodage transmis par le Serveur au Navigateur par défaut
CharsetSourceEnc UTF8 # Transcodage forcé de TOUS les fichiers téléchargés sur le serveur

Créer vos propres pages d'erreur

Si vous voulez voir après un lien incorrect une autre page, faite, par exemple, par vous-même, alors nous spécifions le code suivant dans .htaccess (enfin, et en conséquence nous créons nos pages là-bas) :

# erreur de serveur, requête invalide
ErrorDocument 400 /error/badrequest.html

# Entrée interdite
Document d'erreur 403 /error/forbid.html

# le plus courant - page introuvable
ErrorDocument 404 /error/notfound.html

# Erreur Interne du Serveur
ErrorDocument 500 /error/serverr.html

Refuser l'accès

Très probablement, vous constaterez que certains fichiers et répertoires devront être fermés à l'accès public.

Nous le fermons à tout le monde

Refuser de tout

Fermer un fichier spécifique de tout le monde


nier de tout

Autoriser l'accès à partir d'une seule ip

Ordre refuser, autoriser
nier de tout
autoriser à partir de 192.111.37.125

Refuser l'accès à partir d'une adresse IP spécifique


ordre autoriser, refuser
permettre à tous
refuser de 192.111.35.122
refuser de 192.111.37.171

Supprimer l'extension de fichier de l'URL (URL)

RewriteEngine activé
RéécrireCond% (REQUEST_FILENAME) ! -D
RewriteCond% (REQUEST_FILENAME) \. Html -f
Règle de réécriture ^ (. *) $ $ 1.php
# php peut être remplacé par une autre extension. Par exemple : html, htm, shtml, asp

Nous interdisons d'afficher le contenu du répertoire s'il n'y a pas de fichier d'index

Vous avez probablement vu le texte au moins une fois. Indice de et une liste de fichiers. Cela se produit lorsque le répertoire pas de fichier d'index(par exemple index.php), et le système vous invite à sélectionner un fichier pour une ouverture ultérieure. L'inconvénient est qu'un utilisateur aléatoire peut voir la liste et le contenu de tous les fichiers du répertoire.
Options -Index

Pour rediriger, configurer CNC sur des sites Web à l'aide de and et insérer des mots-clés dans les URL d'articles, toutes les directives écrites dans cet article sont écrites dans le fichier .htaccess, qui se trouve généralement à la racine de votre site, bien que dans certains cms, il se trouve dans presque tous les dossiers mais c'est une histoire complètement différente….

Voici 5 exemples d'utilisation de ce module :

1) Modifiez "product.php? Id = 12" en "product-12.html"

Il s'agit d'une simple redirection où l'extension .php est masquée dans la barre d'adresse du navigateur et l'URL dynamique (avec un point d'interrogation " ?") est convertie en une adresse statique

RewriteEngine activé
RewriteRule ^ produit - (+) \. Html $ produit.php? Id = 1 $

2) Modifiez "product.php? Id = 12" en "product/ipod-nano/12.html"

Les experts en référencement suggèrent toujours d'afficher le premier mot-clé dans l'URL. À titre d'exemple, vous pouvez voir le nom du produit dans l'URL.

RewriteEngine activé
RewriteRule ^ produit / (+) / (+) \. Html $ produit.php? Id = 2 $

3) Redirection d'adresses sans URL www vers des adresses avec www - redirect

Si vous entrez yahoo.com dans votre navigateur, vous serez redirigé vers www.yahoo.com. Pour effectuer la même opération sur votre site, ajoutez le code suivant à votre fichier .htaccess :

Moteur de réécriture activé
RewriteCond% (HTTP_HOST) ^ optimaxwebsolutions \ .com $
RewriteRule (. *) Http://www.optimaxwebsolutions.com/1$

L'URL du site, bien sûr, devient la vôtre. Pourquoi faire une telle redirection ? Pour éviter la duplication du site par les moteurs de recherche avec et sans www.

4) Réécrivez "votresite.com/user.php?username=xyz" en "votresite.com/xyz"

Ajoutez les lignes suivantes au fichier .htaccess :

Moteur de réécriture activé
RewriteRule ^ (+) $ user.php? Nom d'utilisateur = $ 1
RewriteRule ^ (+) / $ user.php? Nom d'utilisateur = $ 1

5) Redirigez le domaine vers un nouveau sous-domaine ou dossier.

Supposons que vous ayez repensé votre site et que le site mis à jour se trouve dans le dossier « nouveau » à la racine du site. C'est-à-dire que le nouveau site est disponible sur « test.com/new ». Déplacer des fichiers d'un emplacement à un autre peut prendre beaucoup de temps, il vous suffit donc d'ajouter les lignes suivantes à votre fichier .htaccess et de le placer dans votre dossier racine :

Moteur de réécriture activé
RewriteCond% (HTTP_HOST) ^ test \ .com $ RewriteCond% (HTTP_HOST) ^ www \ .test \ .com $
RewriteCond% (REQUEST_URI) ! ^ / Nouveau /
Règle de réécriture (.*) / Nouveau / 1 $

Désormais, lors de l'accès à "www.test.com", tous les fichiers seront extraits de "test.com/new"

mod_rewrite : adresse cnc statique avec une variable

Donc, dans cet article, j'ai dit que les sites sur PHP et MySQL avoir des adresses au format suivant :

En règle générale, ces adresses sont appelées dynamiques. Nous allons donc maintenant traiter de la conversion d'adresses dynamiques en CNC.

Disons que vous devez convertir à partir de lis.php? id = 3 v bols3.hi... L'expression régulière aura le format suivant :

RewriteRule ^ PAGE NAME (+) \. EXTENSION $ CURRENT ADDRESS NAME.php? VARIABLE = $ NUMBER

C'est-à-dire, dans notre cas, nous obtenons ce qui suit :

RewriteRule ^ bols (+) \. Salut $ lis.php? Id = $ 1

Maintenant au lieu de l'adresse lis.php?id = 90(où 90 est id) nous pouvons nous référer en toute sécurité à bols90.salut.

mod_rewrite : adresse cnc statique avec de nombreuses variables

Considérez une situation où vous devez traduire une adresse avec de nombreuses variables. Par exemple de lis.php? id = 345 & chat = 3 v bols345-3.hi... La situation est similaire, mais maintenant deux variables GET sont utilisées. Un tiret est utilisé comme séparateur. On obtient l'expression suivante :

RewriteRule ^ bols (+) - (+) \. Salut $ lis.php? Id = 1 $ & cat = 2 $

Graphiquement, le principe de transformation lui-même ressemblera à ceci :

mod_rewrite : adresse cnc archivée

De nombreuses archives sur le site ont une adresse archive.php? année = 2003 & mois = 10... Nous allons le transformer en archives / 2003/10 /... On obtient la ligne suivante :

RewriteRule ^ archive / (+) / (+) \ $ archive.php? Année = 1 $ & mois = 2 $

mod_rewrite : adresse cnc pour les balises

De nos jours, les tags sont présents sur presque tous les blogs et sites Web. Essayons de changer l'adresse du tag hiver - posts.php?Tag = hiver v messages / tags / hiver /... On a l'expression suivante :

RewriteRule ^ posts / tags / (+) \ $ posts.php? Tag = 1 $

Soit dit en passant, les moteurs de recherche utilisent un algorithme distinct pour indexer les pages avec des adresses dynamiques. Je ne sais pas en quoi cela diffère de l'habituel, mais Conversions CNC, encore une fois, ils aident à dire au robot qu'il a besoin d'indexer notre adresse, comme une page statique normale.

andou

2015-02-13T11 : 59 : 58 + 00 : 00

2018-03-02T04 : 50 : 41 + 00 : 00

34141

Dans cet article, je fournis une description de la logique de la RewriteRule et de la syntaxe de certaines directives du module mod_rewrite du serveur Apache. J'ai également souligné et résumé plusieurs conclusions, postulats, qui, me semble-t-il, doivent être connus et compris lors de l'utilisation de ce module. J'espère que tout cela vous permettra, tout comme moi auparavant, de comprendre le travail de ce module, qui fournit des fonctionnalités puissantes pour effectuer diverses transformations sur les URL..

Ne pas oublier dans regex protéger symboles de service. Parfois, ils oublient d'échapper à un point alors qu'il devrait agir exactement comme un point, et non comme il est d'usage dans une expression régulière - comme n'importe quel caractère.

N'oubliez pas non plus d'envelopper l'ensemble du bloc de règles pour mod_rewrite dans la balise :

N'écrivez pas trop de directives pour mod_rewrite, écrivez uniquement les règles de transformation dont vous avez réellement besoin. Vous devez particulièrement faire attention aux redirections externes - ce sont des redirections qui sont effectuées en envoyant l'en-tête du serveur avec le code au client NE PAS 200 (retour d'une page à part entière), et avec un code différent (le plus souvent 301 et 302 ) et qui conduisent à une redirection dans le navigateur du client vers une autre URL, c'est-à-dire faire une nouvelle demande sur le client. Par conséquent, toute redirection externe entraîne toujours une perte de temps dans le traitement de la demande, puisque vous devez envoyer une réponse au client, il doit la lire et répéter la demande en utilisant la nouvelle URL. C'est une procédure qui prend du temps. Par conséquent, il ne devrait y avoir de redirection que si vous en avez vraiment besoin.

Sachez que les navigateurs peuvent cache redirige, tandis que Ctrl + F5 ou Ctrl + R ne résout pas le problème. Donc désactiver mise en cache dans le navigateur lors du test de vos règles récrire module la toile serveur Apache.

Pour trouver des erreurs dans le travail de vos règles, lisez les logs. Apache.

Ne faites pas un copier-coller ennuyeux des directives de divers articles sur Internet dans vos fichiers de configuration Apache. Les articles sont écrits par des personnes et donc l'écriture erronée de directives est possible, et si l'on tient compte du fait que la méthode d'écriture des articles implique également l'utilisation active du copier-coller, alors les erreurs peuvent se propager et se multiplier. Utilisez les articles uniquement comme référence et écrivez les directives des manuels dans vos fichiers de configuration. Bien que cela ne garantisse pas non plus cent pour cent des erreurs, au moins vous les minimisez.

Dans cet article, je n'ai décrit que deux directives et les principaux concepts à mon avis. Cependant, comme vous le comprenez vous-même, mod_rewrite fournit de nombreuses autres directives et fonctionnalités.

Vous avez aimé l'article ? A partager avec des amis :