Exemple de transformări URL. Ce este mod_rewrite

Pentru redirecționare, configurarea CNC pe site-uri web folosind și, și inserarea de cuvinte cheie în URL-urile articolului, toate directivele prescrise în acest articol sunt scrise în fișierul .htaccess, care se află de obicei în rădăcina site-ului dvs., deși în unele cms este în aproape fiecare folder, dar asta este o poveste complet diferită...

Mai jos sunt 5 exemple de utilizare a acestui modul:

1) Convertiți „product.php?id=12” în „product-12.html”

Aceasta este o redirecționare simplă în care extensia .php este ascunsă din bara de adrese a browserului și URL-ul dinamic (cu un semn de întrebare „?”) este convertit într-o adresă statică

RewriteEngine activat
RewriteRule ^product-(+)\.html$ product.php?id=$1

2) Schimbați „product.php?id=12” în „product/ipod-nano/12.html”

Experții SEO sugerează întotdeauna afișarea cuvântului cheie principal în adresa URL. De exemplu, puteți vedea numele produsului în adresa URL.

RewriteEngine activat
RewriteRule ^produs/(+)/(+)\.html$ product.php?id=$2

3) Redirecționarea adreselor fără www URL către adrese cu www - redirecționare

Dacă introduceți yahoo.com în browser, veți fi redirecționat către www.yahoo.com. Pentru a efectua aceeași operațiune pe site-ul dvs., adăugați următorul cod în fișierul .htaccess:

RewriteEngine Pornit
RewriteCond %(HTTP_HOST) ^optimaxwebsolutions\.com$
RewriteRule (.*) http://www.optimaxwebsolutions.com/$1

Desigur, schimbați adresa URL a site-ului cu propria dvs. De ce se face o astfel de redirecționare? Pentru a evita duplicarea site-ului de către motoarele de căutare cu și fără www.

4) Schimbați „yoursite.com/user.php?username=xyz” în „yoursite.com/xyz”

Adăugați următoarele linii în fișierul .htaccess:

RewriteEngine Pornit
RewriteRule ^(+)$ user.php?username=$1
RewriteRule ^(+)/$ user.php?username=$1

5) Redirecționarea domeniului către un nou subdomeniu sau folder.

Să presupunem că v-ați reproiectat site-ul și site-ul actualizat se află în folderul „nou” din rădăcina site-ului. Adică, noul site este disponibil la „test.com/new”. Mutarea fișierelor dintr-o locație în alta poate fi un proces destul de obositor, așa că pur și simplu adăugați următoarele linii în fișierul dvs. .htaccess și plasați-l în folderul rădăcină:

RewriteEngine Pornit
RewriteCond %(HTTP_HOST) ^test\.com$ RewriteCond %(HTTP_HOST) ^www\.test\.com$
RewriteCond %(REQUEST_URI) !^/new/
RewriteRule (.*) /new/$1

Acum, când accesați „www.test.com”, toate fișierele vor fi preluate de pe „test.com/new”

mod_rewrite: adresa NC statică cu o variabilă

Deci, în acest articol am spus că site-urile pe PHP și MySQL au adrese în următorul format:

De regulă, astfel de adrese sunt numite dinamice. Acum vom începe să convertim adresele dinamice în CNC.

Să presupunem că trebuie să ne convertim de la lis.php?id=3 V bols3.hi. Expresia regulată va avea următorul format:

RewriteRule ^PAGE NAME(+)\.EXTENSION$ ADRESĂ REALĂ NAME.php?VARIABLE=$NUMĂRARE

Adică, în cazul nostru obținem următoarele:

RewriteRule ^bols(+)\.hi$ lis.php?id=$1

Acum în loc de adresă lis.php?id=90(unde 90 este id) putem accesa în siguranță bols90.hi.

mod_rewrite: adresa NC statică cu multe variabile

Luați în considerare o situație în care trebuie să convertiți o adresă cu multe variabile. De exemplu, de la lis.php?id=345&cat=3 V bols345-3.hi. Situația este similară, dar acum sunt utilizate două variabile GET. O liniuță este folosită ca separator. Obținem următoarea expresie:

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

Grafic, principiul transformării în sine va arăta astfel:

mod_rewrite: adresa CNC de arhivă

Multe arhive de pe site au o adresă archive.php?year=2003&month=10. O vom transforma in arhiva/2003/10/. Obținem următoarea linie:

RewriteRule ^archive/(+)/(+)\$ archive.php?year=$1&month=$2

mod_rewrite: adresa CNC pentru etichete

În zilele noastre, etichetele sunt prezente pe aproape fiecare blog și site web. Să încercăm să schimbăm adresa pentru eticheta de iarnă — posts.php?tag=iarnă V postări/etichete/iarnă/. Avem următoarea expresie:

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

Apropo, motoarele de căutare folosesc un algoritm separat pentru a indexa paginile cu adrese dinamice. Nu știu cu ce diferă de cea obișnuită, dar Conversii CNC, din nou, ajută la indicarea robotului că trebuie să ne indexăm adresa ca pe o pagină statică obișnuită.


Exemple de intrări htaccess: Fișier index, Redirecționează menținând ratingul pagini, lipire www și http, Creația CNC sau URL-uri de înțeles uman, Redirecționați toate fișierele dintr-un folder către un singur fișier, Protecție împotriva hotlink-uri, Definiție codificăriși mult mai mult!

Specificați fișierul index (care este primul care se deschide la accesarea site-ului)

DirectoryIndex index.php index.html index.shtml
Puteți specifica unul sau mai multe fișiere

Redirecționează htaccess php

Redirecționare / http://www.newsite.ru/
Redirecționare globală (primul /) trimitem TOTUL la noua adresă http://www.newsite.ru/

Redirecționează /katalog http://www.newsite.ru/newkatalog
Toate cererile către catalog redirecționează către domeniu newsite.ru la secţionare newkatalog

Redirecționează în același timp menținând clasarea paginii

Redirecționare 301 /old/old.php http://www.yoursite.ru/new.php
vechi- un exemplu de cale a paginii vechi. nou- un exemplu de cale a unei pagini noi.

Redirecționează un utilizator cu o anumită ip

SetEnvIf REMOTE_ADDR 192.100.220.1 REDIR="redir"
RewriteCond %(REDIR) redir
RewriteRule ^/$ /out.html
Un anumit utilizator (s-a săturat de el sau trebuie trimis la secțiunea internă) cu un ip dat este trimis la pagina /out.html

Fuzionarea www și http htaccess php

Mulți SEO (promovare și optimizare) știu deja că pentru Motoarele de căutare adrese cu/fără www- acestea sunt adrese diferite iar accesibilitatea site-ului cu www afectează negativ indexarea și clasarea. Prin urmare, SEO-urile cer adesea dezvoltatorilor să lipească site-ul fara www(astfel încât la accesarea unui site de pe www, acesta va fi redirecționat către unul fără www, adică doar http)

RewriteEngine Pornit
RewriteCond %(HTTP_HOST) ^www.yoursite\.ru$
RewriteRule ^(.*)$ http://yoursite.ru/$1
Acum chiar dacă tastați în bara de adrese www.yoursite.ru, apoi serverul vă va redirecționa către http://yoursite.ru

Crearea CNC sau URL-uri înțelese de om htaccess php

RewriteEngine activat
RewriteRule ^articol/([^/\.]+)/?$ article.php?id=$1 [L]
După adăugarea acestei linii la .htaccess două adrese vor fi disponibile pentru document. De exemplu: Și www.yoursite.ru/article/1

RewriteEngine activat
RewriteRule cat/(.*)/(.*)/$ /art.php?$1=$2
Ca urmare www.yoursite.ru/art.php?type=123 se transformă în www.yoursite.ru/cat/type/123/:

Iată mai multe opțiuni private:

RewriteEngine activat
RewriteRule katalog-saitov[/]*$ article.php?id=$1 [L]
Articol cu ​​adresa tehnica www.yoursite.ru/article.php?id=1 va fi acum disponibil cu propriul nume care poate fi citit de om www.yoursite.ru/katalog-saitov.

Redirecționează toate fișierele dintr-un folder către un singur fișier

De exemplu, nu mai aveți nevoie de secțiunea articole a site-ului dvs. și doriți să redirecționați toate solicitările către folderul /articles către un singur fișier /non-articles.php. Codul de mai jos vă va ajuta

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

Protecție împotriva hotlink-urilor htaccess php

Este posibil să fiți familiarizat cu această opțiune atunci când imaginile nu sunt încărcate pe server, ci pur și simplu se folosește un link către site. Ca urmare, se creează o încărcare suplimentară de trafic pentru site-ul care deține imaginea. Utilizați codul de mai jos

RewriteEngine Pornit
#În conformitate cu?yoursite\.ru/ modificați această construcție la adresa URL a site-ului dvs
RewriteCond %(HTTP_REFERER) !^http://(.+\.)?site-ul tău\.ru/
RewriteCond %(HTTP_REFERER) !^$
#Schimbați /images/exit.jpg într-o altă imagine. Posibil indecent
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/exit.jpg [L]

Determinarea codificării htaccess php

Opțiuni suplimentare pentru cele mai populare codificări: UTF-8, Windows-1251, KOI8-R. În exemple vom lua în considerare cel mai comun UTF-8
AddDefaultCharset UTF8 # codificare fișier în care documentele sunt trimise implicit
AddCharset UTF8 .html # Exemplu: procesează html în această codificare
AddCharset UTF8 * # Exemplu: procesează toate fișierele din această codificare

# Procesați un anumit fișier în această codificare

AddCharset UTF8.html

CharsetDisable On # Anulați recodificarea fișierelor descărcate de către server
CharsetDefault UTF8 # Codificare trimisă implicit de server către Browser
CharsetSourceEnc UTF8 # Recodificarea forțată a TOATE fișierele încărcate pe server

Crearea propriilor pagini de eroare

Dacă doriți să vedeți o altă pagină după un link incorect, făcut, de exemplu, de dvs., atunci specificați următorul cod în .htaccess (și, în consecință, creați-vă propriile pagini acolo):

# eroare de server, cerere nevalidă
ErrorDocument 400 /error/badrequest.html

# Intrarea interzisă
ErrorDocument 403 /error/forbid.html

# cea mai comună - pagina nu a fost găsită
ErrorDocument 404 /error/notfound.html

# Internal Server Error
ErrorDocument 500 /error/serverr.html

Interzicem accesul

Cel mai probabil, veți întâlni faptul că unele fișiere și directoare vor trebui să fie închise de la accesul public.

Închis de toată lumea

Negați de la toți

Închideți un anumit fișier de la toată lumea


nega de la toti

Permitem accesul de la un singur IP

Comanda refuzată, permiteți
nega de la toti
permite de la 192.111.37.125

Interzicem accesul de la anumite IP-uri


comanda permite, refuza
permite de la toti
nega din 192.111.35.122
nega din 192.111.37.171

Eliminarea extensiei de fișier din URL

RewriteEngine activat
RewriteCond %(REQUEST_FILENAME) !-d
RewriteCond %(REQUEST_FILENAME)\.html -f
RewriteRule ^(.*)$ $1.php
# php poate fi înlocuit cu o altă extensie. De exemplu: html, htm, shtml, asp

Interzicem afișarea conținutului unui director dacă nu există un fișier index

Cel mai probabil ați văzut textul cel puțin o dată Index deși o listă de fișiere. Acest lucru se întâmplă când sunteți în director nici un fișier index(de exemplu index.php), iar sistemul vă solicită să selectați un fișier pentru deschidere ulterioară. Dezavantajul este că un utilizator ocazional poate vedea lista și conținutul tuturor fișierelor dintr-un director.
Opțiuni -Indici

Fișierul de configurare .htaccess este o configurație pentru serverele web Apache. Majoritatea site-urilor de găzduire funcționează prin acest server, așa că fiecare site are acest fișier. Webmasterii pot controla parțial funcționarea acestuia făcând propriile modificări. În acest articol ne vom uita la directivele și regulile care pot fi modificate în funcționarea serverului.

Cel mai important fișier .htaccess se află la rădăcina site-ului:

Acțiunile sale se aplică directorului curent și tuturor subdirectoarelor. Acestea. Proprietarii de site-uri au posibilitatea de a influența numai activitatea proiectului lor, fără a interfera cu activitatea întregului server. Dacă acest fișier lipsește, acesta poate fi creat folosind orice bloc de note. Principalul lucru este că numele fișierului ar trebui să fie „.htaccess” - fără formate .txt, .doc etc.

Folosind fișierul .htaccess, redirecționările 301 sunt cel mai adesea configurate la nivel de server, ceea ce accelerează foarte mult procesul de mutare la o pagină nouă, deoarece nu este nevoie să încărcați o pagină intermediară. De asemenea, specifică ce fișier procesează eroarea 404.

Mai jos ne vom uita la toate opțiunile comune pentru redirecționări prin .htaccess și mai întâi ne vom familiariza cu opțiunile și regulile.

Pentru a putea lucra cu redirecționări, trebuie să activați modulul ReWriteEngine. Pentru a face acest lucru, trebuie să scrieți două linii de cod (de preferință chiar în partea de sus a fișierului .htaccess):

Opțiuni +FollowSymLinks RewriteEngine Activat

Plasați aceste linii în partea de sus a fișierului dvs. .htaccess pentru a putea lucra cu directivele modulului mod_write.

De asemenea, modulele mod_alias trebuie să fie activate pe găzduire (pentru a suporta Redirect, RedirectPermanent și RedirectMatch).

1. Regulile Redirect, RewriteRule și RewriteCond

1.1. Directiva de redirecționare

Sintaxa redirecționării:

Redirecționează/de la http://unde_adresă_completă

Redirecționarea setează o redirecționare directă de la o pagină la alta.

Codul de redirecționare este scris în stare. Este un parametru opțional. Cel mai adesea scriu 301, ceea ce semnalează o schimbare permanentă a adresei paginii.

Este important ca pagina „de la” să fie scrisă într-un format fără a indica adresa completă a site-ului, dar indicând adresa URL relativă completă începând cu o bară oblică „/” (adică de la rădăcina site-ului). Pagina în care merge redirecționarea trebuie să fie scrisă în întregime, de exemplu. URL absolută a paginii URL (adică cu numele domeniului și protocolul http sau https).

De exemplu

Redirecționare 301 /oldpage.php http://site/newpage.php

De asemenea, puteți scrie altfel

RedirectPermanent 301 /oldpage.php http://site/newpage.php sau Redirect permanent 301 /oldpage.php http://site/newpage.php

1.2. Directiva RewriteRule

Directiva RewriteRule stabilește regulile de tranziție. Sintaxa este următoarea:

RewriteRule Pattern Substitution [coduri]
  • Când are loc o redirecționare externă, adresa URL din linia browserului se schimbă - " "
  • Cu intern - nu modifică adresa URL în linia browserului - " " sau " [L] "

1.3. Directiva RewriteCond

Directiva RewriteCond definește condițiile în care sunt executate regulile din RewriteRule.

RescrieCond Compare_String Condiție

De exemplu, acești termeni ar putea fi browserul utilizatorului, adresa IP, titlul etc.

1.4. Directiva RedirectMatch

Directiva RedirectMatch este similară cu Redirect, singura diferență fiind că vă permite să scrieți expresii regulate.

RedirectMatch De la To

2. Exemple de redirecționări 301 în .htaccess

Ne-am uitat deja la multe exemple cu o redirecționare .htaccess în articole:

  • Schimbarea adresei site-ului - redirecționarea de la vechiul domeniu la cel nou

Aici vom adăuga opțiuni pentru redirecționări care nu existau încă.

2.1. Redirecționează de la o pagină la alta

Redirecționați de la site.ru/cat/oldpage la site.ru/newpage.html

RewriteRule ^cat/oldpage.* /newpage.html

Sau a doua varianta:

Redirecționează 301 /cat/oldpage http://www.site.com/newpage.php

2.2. Redirecționați de la toate fișierele .htm la .html

RewriteCond %(REQUEST_FILENAME) !-f RewriteRule ^(.*)\.htm$ $1.html

Sau a doua varianta:

RewriteRule ^(.*)\.htm$ $1.html

2.3. Redirecționează întregul director către o altă pagină

Orice pagină din directorul și subdirectoarele /vechiul/ va fi redirecționată către /new.php

RewriteRule ^old(.*)$ /new.php

2.4. Eliminarea barelor oblice suplimentare dintr-o adresă URL

De exemplu, pagina /catalog///stranica.html este accesibilă și se deschide. Pentru a evita această situație și pentru a nu crea un număr infinit de duplicate, ar trebui să scrieți următoarea redirecționare

RewriteCond %(REQUEST_URI) ^(.*)//(.*)$ RewriteRule . %1/%2

2.5. Rescrie fără redirecționare

Puteți încărca o altă pagină fără a modifica adresa URL a paginii. De exemplu, să încărcăm pagina /news.html, iar bara de adrese va afișa adresa /news/happy

RewriteRule ^news/happy.* /news.html [L]

2.6. Adăugarea unei bare oblice la sfârșitul adresei paginii de pornire

De exemplu, multe servere funcționează în așa fel încât ultima bară oblică să nu fie scrisă în URL. De exemplu, http://site.ru. Codul de mai jos rezolvă această problemă: site-ul se va deschide la http://site.ru/

RewriteCond %(REQUEST_URI) /+[^\.]+$ RewriteRule ^(.+[^/])$ %(REQUEST_URI)/

2.7. Se elimină directorul director din URL

De exemplu, pentru a redirecționa dintr-o pagină site.com/directoriya/stranica.html pe site.com/stranica.html trebuie să introduceți următoarele:

RewriteRule ^directoriya/(.+)$ http://site.com/$1

Sau a doua varianta:

RescrieCond %(DOCUMENT_ROOT)/directoria/$1-f RewriteRule ^(.*)$ directoriya/$1

2.8. Redirecționează parametrii GET

De exemplu, redirecționați de la pagina /?act=page&id=2 la /page-2/

RewriteCond %(QUERY_STRING) act=page RewriteCond %(QUERY_STRING) id=(\d+) RewriteRule .* /page/%1/? ]

2.9. Redirecționați către versiunea mobilă a site-ului m.site.ru

În acest exemplu, faptul că utilizatorul a deschis site-ul de pe un dispozitiv mobil (HTTP_USER_AGENT) este mai întâi verificat, apoi adresa site-ului este înlocuită cu m.URL

RewriteCond %(HTTP_HOST) ^(.*)$ RewriteCond %(HTTP_USER_AGENT) (?i:midp|samsung|nokia|j2me|avant|docomo|novarra|palmos|palmsource|opwv|chtml|pda|mmp|blackberry|mib|symbian|wireless|nokia|hand|mobi|phone|cdm|upb| audio|SIE|SEC|samsung|HTC|mot-|mitsu|sagem|sony|alcatel|lg|eric|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java |pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|dddi|moto|iphone|android) RewriteRule ^$ http://m.%1

2.10. Redirecționare dintr-un subdomeniu

De exemplu, să redirecționăm din orice pagină a subdomeniului poddomen.site.ru către domeniul principal site.ru

RewriteCond %(HTTP_HOST) ^poddomen.site.ru$ RewriteRule ^(.*)$ http://site.ru%(REQUEST_URI)

3.Alte exemple cu htaccess

3.1. Respinge adresa IP și browser

Vom interzice deschiderea site-ului pentru un utilizator care utilizează un browser IE cu adresa IP 172.111.222.55

RewriteCond %(HTTP_USER_AGENT) MSIE RewriteCond %(REMOTE_ADDR) ^172\.111\.222\.55$ RewriteRule ^.*$ - [F]

3.2. Respinge un anumit fișier

Să dezactivăm fișierul disable_file.html pentru toată lumea:

nega de la toti

3.3. Permite accesul de la un IP

Accesul va fi permis doar de la o singură adresă IP 172.111.222.55

comanda refuza, permite refuzul de la toate permit de la 172.111.222.55

3.4. Interziceți accesul de la IP-uri diferite

Interziceți accesul la site de la mai multe adrese IP 172.112.222.55, 172.113.222.55, 172.114.*.*

comanda refuza, permite refuza din toate refuza de la 172.112.222.55 refuza de la 172.113.222.55 refuza 172.114.*.*

3.5. Adresa URL de redirecționare de la caractere mari la cele mici

Toate majusculele din adresa URL vor fi convertite în litere mici.

RewriteRule - RewriteRule! - RewriteRule ^([^A]*)A(.*)$ $1a$2 RewriteRule ^([^B]*)B(.*)$ $1b$2 RewriteRule ^([^C]*)C(.* )$ $1c$2 RewriteRule ^([^D]*)D(.*)$ $1d$2 RewriteRule ^([^E]*)E(.*)$ $1e$2 RewriteRule ^([^F]*) F(.*)$ $1f$2 RewriteRule ^([^G]*)G(.*)$ $1g$2 RewriteRule ^([^H]*)H(.*)$ $1h$2 RewriteRule ^([^ I]*)I(.*)$ $1i$2 RewriteRule ^([^J]*)J(.*)$ $1j$2 RewriteRule ^([^K]*)K(.*)$ $1k$2 RewriteRule ^([^L]*)L(.*)$ $1l$2 RewriteRule ^([^M]*)M(.*)$ $1m$2 RewriteRule ^([^N]*)N(.*)$ $1n$2 RewriteRule ^([^O]*)O(.*)$ $1o$2 RewriteRule ^([^P]*)P(.*)$ $1p$2 RewriteRule ^([^Q]*)Q( .*)$ $1q$2 RewriteRule ^([^R]*)R(.*)$ $1r$2 RewriteRule ^([^S]*)S(.*)$ $1s$2 RewriteRule ^([^T] *)T(.*)$ $1t$2 RewriteRule ^([^U]*)U(.*)$ $1u$2 RewriteRule ^([^V]*)V(.*)$ $1v$2 RewriteRule ^( [^W]*)W(.*)$ $1w$2 RewriteRule ^([^X]*)X(.*)$ $1x$2 RewriteRule ^([^Y]*)Y(.*)$ $1y $2 RewriteRule ^([^Z]*)Z(.*)$ $1z$2 RewriteRule - [N] RewriteCond %(ENV:HASCAPS) TRUE RewriteRule ^/?(.*) /$1

Ce este mod_rewrite mod_rewrite este un modul de server web Apache folosit pentru a rezolva URL-uri. Transformarea ar trebui să fie înțeleasă ca practic orice acțiune cu o adresă URL. Acesta este un instrument foarte puternic și, în același timp, flexibil, cu capacități foarte largi. Modulul vă permite să efectuați aproape orice tip de transformare. Folosind mod_rewrite, puteți configura redirecționări, schimba adrese URL, blocați accesul etc. Suportă un număr nelimitat de reguli de transformare, expresii regulate, apeluri inverse cu părți grupate ale șablonului, diferite surse de informații pentru transformări (variabile de server, anteturi HTTP, timp etc.). Datorită acestui set de capabilități, se obține o funcționalitate ridicată și flexibilitate. În mod implicit, acest modul este dezactivat pentru a-l activa, trebuie să adăugați următoarele directive la .htaccess:

RewriteEngine Pornit
RewriteBase /

RewriteEngine Pornit- directiva activează modulul.
RewriteBase— indică calea de la rădăcina site-ului la fișierul .htaccess. Dacă .htaccess este în rădăcină, atunci trebuie să specificați acest parametru ca în exemplu, dacă se află în directorul intern, atunci specificați calea către acest director, de exemplu /images.

Cum funcționează modulul mod_rewrite

Funcționarea modulului se bazează pe un set de reguli și condiții conform cărora se realizează transformarea. La primirea unei cereri, Apache transmite mod_rewrite calea către fișier pornind de la locația în care se află fișierul .htaccess, restul căii este trunchiată. Dacă se primește o solicitare http://some-url.com/cat/cat2/file.html, iar .htaccess este în rădăcină, atunci mod_rewrite va include cat/cat2/file.html (fără bara oblică). Dacă .htaccess se află în directorul /cat, atunci mod_rewrite va conține cat2/file.html. În continuare, mod_rewrite analizează regulile în .htaccess și acționează conform acestor reguli. Merită să știți că mod_rewrite nu funcționează cu link-uri sau URL-uri, ci cu șiruri obișnuite. Adică, adresa care trebuie convertită este transmisă la mod_rewrite ca șir obișnuit, iar acest șir poate fi convertit după cum doriți. Pentru a construi reguli, sunt utilizate două directive, RewriteCond și RewriteRule (aceste directive sunt descrise mai detaliat mai jos).
RescrieCond— această directivă definește condițiile în care va funcționa regula de transformare RewriteRule. Dacă condiția din RewriteCond este îndeplinită, executăm regula în RewriteRule. Poate exista un număr nelimitat de astfel de condiții înainte de regula RewriteRule. RewriteCond nu este o directivă necesară pentru a crea o regulă de conversie și poate lipsi.
RewriteRule— aici este deja indicată regula pentru transformarea în sine, care ar trebui să fie singura pentru o anumită transformare.
Un exemplu de cum arată în .htaccess:

RewriteCond %(REQUEST_URI) !.(ico|css|js|txt)$
RewriteCond %(REQUEST_FILENAME) !^/admin

Chiar dacă directiva RewriteCond este mai mare decât RewriteRule, mod_rewrite verifică mai întâi șirul cu modelul din RewriteRule, iar dacă șirul se potrivește cu modelul, se uită la condițiile de mai sus în RewriteCond. Dacă și condițiile se potrivesc, transformarea are loc conform regulii RewriteRule. Să aruncăm o privire mai atentă la sintaxa și scopul directivelor RewriteCond și RewriteRule.

RescrieCond

După cum sa menționat mai sus, această directivă specifică condițiile în care va fi executată regula din directiva RewriteRule. Această directivă arată astfel:

RewriteCond [șir de comparare] [condiție] [steagul]
RewriteCond %(REQUEST_URI) !.(ico|css|js|txt)$

În acest exemplu, regula condiției va fi îndeplinită dacă cererea utilizatorului nu conține extensia ico, css, js sau txt.
Șir de comparat— pe lângă textul simplu, poate conține o expresie regulată, conexiuni inverse RewriteCond și RewriteRule și variabile de server. În practică, aceasta utilizează variabile de server și uneori expresii regulate.
Condiție- cu asta se compară de fapt șirul de comparație. Poate conține text, expresii regulate și caractere speciale:

  • "-d"— verifică corectitudinea căii (existența acesteia) și dacă această cale este o cale către un director.
  • "-f"— verifică corectitudinea căii (existența acesteia) și dacă această cale este calea către un fișier obișnuit.
  • "-s"- la fel ca -f, dar verifică suplimentar dacă dimensiunea fișierului este mai mare decât 0 (zero).
  • "-l"— verifică corectitudinea căii (existența ei) și dacă această cale este o legătură simbolică.
  • "-F"— verifică printr-o subinterogare internă dacă șirul care este comparat este un fișier real existent, folosind toate listele de control de acces existente ale serverului. Acest lucru are un impact negativ asupra performanței și trebuie utilizat cu prudență.
  • "-U"— verifică printr-o subinterogare internă dacă șirul care este comparat este de fapt o adresă URL, utilizând toate listele existente de control al accesului la server. Acest lucru are un impact negativ asupra performanței și trebuie utilizat cu prudență.
În plus, înainte de condiție, este permisă utilizarea simbolurilor logice:
  • "!" - inversarea valorii, indică faptul că șirul care este comparat nu trebuie să se potrivească cu modelul de condiție.
  • "<" - mai puțin din punct de vedere lexical. De exemplu, caracterul „a” este mai mic din punct de vedere lexical decât caracterul „b”, „a”< "b".
  • ">" - lexical mai mult.
  • "=" — egalitate, utilizată implicit.

Steag— un parametru opțional care specifică opțiuni suplimentare (separate prin virgule dacă există mai multe dintre ele). Indicat la sfârșitul regulii între paranteze drepte.

  • — insensibil la majuscule, adică cazul (A-Z sau a-z) din linia sau condiția de comparație nu contează.
  • - SAU logic. Folosit atunci când o directivă RewriteRule este precedată de mai multe directive RewriteCond și regula din RewriteRule trebuie executată atunci când unul dintre RewriteConds se potrivește Dacă nu este specificat indicatorul OR, RewriteRule se va declanșa numai dacă toate directivele RewriteCond se potrivesc.

RewriteRule

​RewriteRule specifică regula de transformare, cum vrem să schimbăm adresa URL. De fapt, această directivă conține și o condiție, dacă se potrivește, conversia va fi efectuată. Acesta este șablonul cu care este verificat șirul mod_rewrite rezultat. Este de remarcat faptul că, dacă nu trebuie să înlocuiți nimic și astfel de cazuri apar uneori, trebuie să indicați o liniuță în noua valoare "-" . Schematic, RewriteRule arată astfel:

RewriteRule [model] [new_value] [flag]
RewriteRule ^(.*)$ /index.php [L]

Probă— cu ce va fi comparat șirul sursă. Șirul sursă nu este neapărat cel solicitat de utilizator. Este posibil să fi fost modificat anterior de alte RewriteRules. Poate conține text simplu, expresii regulate și conexiuni inverse RewriteCond și RewriteRule. Linia sursă este calea de la fișierul .htaccess la fișier, numele domeniului nu este acolo.
Sens nou este valoarea la care va fi schimbat șirul original după transformare. Poate conține text simplu, expresii regulate, conexiuni inverse RewriteCond și RewriteRule și variabile de server.
Steag— ​parametru opțional care specifică opțiuni suplimentare (separate prin virgule dacă există mai multe dintre ele). Indicat la sfârșitul regulii între paranteze drepte.

  • - redirecționare. codul este codul de răspuns al browserului, implicit este 302 (mutat temporar), deci pentru o redirecționare permanentă utilizați codul 301.
  • [F]- interzice accesul la URL, Interzis. Serverul returnează un cod de eroare 403 în browser.
  • [G]— returnează eroarea 410, URL-ul nu există.
  • [P]- Apache efectuează o subcerere la adresa specificată folosind un alt modul Apache mod_proxy.
  • [L]- ultima regulă. Indică faptul că conversia URL ar trebui oprită în acest moment.
  • [N]— procesul de transformare va fi reluat, începând chiar de la prima regulă. Va fi folosit șirul modificat anterior.
  • [C]— legătura cu următoarea regulă, se creează un lanț de reguli. Dacă o regulă nu se potrivește, toate regulile ulterioare din lanț sunt sărite.
  • — regulile sunt declanșate numai pentru interogări, subinterogările sunt ignorate.
  • [T]— forțați specificarea tipului MIME al fișierului.
  • - Ignorați majuscule și minuscule.
  • — completați șirul de interogare, mai degrabă decât înlocuiți-l. Indicatorul ar trebui folosit atunci când lucrați cu parametrii GET din variabila %(QUERY_STRING), pentru a nu-i pierde. Dacă acest flag nu este specificat, datele din %(QUERY_STRING) vor fi complet înlocuite cu parametrii din RewriteRule. Dacă este specificat indicatorul, noi parametri vor fi adăugați la începutul lui %(QUERY_STRING).
  • — interzice conversia caracterelor speciale în echivalentele lor hexadecimale.
  • — oprește conversia și transmite șirul pentru procesare de către alte directive (Alias, ScriptAlias, Redirect etc.).
  • [S]— sări peste următoarea regulă. Este posibil să se specifice mai multe reguli în formatul S=N, unde N este numărul de reguli.
  • — setați o variabilă de mediu, unde VAR este numele variabilei și VAL este valoarea acesteia. Valoarea poate fi inversa lui RewriteCond și RewriteRule sau text.
  • — instalați cookie-uri în browser. NAME - nume cookie, VAL - valoare, domeniu - nume domeniu, durata de viață - durata de viață (opțional), cale - calea pentru care acest cookie este valid, implicit este „/”, securizat - dacă este setat la 1 sau adevărat, cookie-urile vor fi valide numai pe conexiune https (securizată), numai http - dacă se setează la 1 sau la true, cookie-urile vor fi disponibile pentru JavaScript.

Feedback-uri RewriteCond și RewriteRule

Feedback-urile sunt abilitatea de a utiliza un grup de caractere (închise între paranteze "()" ) pentru înlocuirea lor ulterioară. De exemplu, puteți specifica o anumită expresie regulată între paranteze și astfel acoperiți un număr mare de adrese.
$N— vă permite să utilizați un grup de caractere din șablonul de directivă RewriteRule.
%N— vă permite să utilizați un grup de caractere din șablonul de directivă RewriteCond.
În locul simbolului „N”, în ambele cazuri se folosește un număr de la 1 la 9.
În practică arată așa. Să ne uităm la un exemplu simplu.
Există o adresă cu o anumită imbricare, http://some-url.com/cat1/cat2/cat3/cat4/page.html. Există dorința de a face pagina http://some-url.com/cat1/cat2/cat3/cat4/page.html disponibilă la http://some-url.com/page.html, dar pe lângă pagină .html, există o grămadă de alte fișiere cu extensia html care ar trebui să fie disponibile și la noua adresă. Acest lucru poate fi rezolvat foarte simplu:

Rescrie regula ^cat1/cat2/cat3/cat4/(html$ $1.html).

Acum, la accesarea adresei http://some-url.com/page.html, vor fi afișate informații de la adresa http://some-url.com/cat1/cat2/cat3/cat4/page.html și deci pe toate adresele precum http://some-url.com/*.html. În același mod, folosind „%N”, puteți înlocui grupuri de caractere din șablon pentru RewriteCond. În acest exemplu, în loc de $1, este înlocuit un grup de caractere între paranteze din șablon.

Variabile de server

Variabilele de server pot conține o mulțime de informații utile care pot și ar trebui folosite pentru a construi reguli. Mai jos este o listă a acestor variabile:
HTTP_USER_AGENT— furnizează informații despre browserul utilizatorului și despre sistemul de operare. Atunci când un utilizator vizitează un site, se transmite un User Agent, de fapt acesta înseamnă software-ul cu care este accesat site-ul.
HTTP_REFERER— adresa paginii de pe care s-a făcut trecerea către site.
HTTP_COOKIE— o listă de cookie-uri trimisă de browser.
HTTP_REPRIMATE— adresa paginii de la care s-a făcut tranziția. Nu am observat prea multă diferență cu HTTP_REFERER.
HTTP_HOST— adresa serverului (site-ului).
HTTP_ACCEPT- acestea sunt dorințele clientului, în funcție de tipul de document pe care dorește să îl primească. În realitate, arată astfel: browserul trimite către server în antetul http tipurile de fișiere pe care dorește să le primească (de obicei, acest lucru se aplică imaginilor și altor fișiere media), adică spune ce tip de fișier poate procesa .
REMOTE_ADDR— adresa IP a vizitatorului.
GAZDA LA DISTANTA— adresa (gazdă) utilizatorului, care este dată de comanda „gazdă” adresei IP.
REMOTE_IDENT— nume de utilizator în formatul nume.gazdă.
REMOTE_USER- la fel ca REMOTE_IDENT, dar nu conține gazda utilizatorului.
​REQUEST_METHOD— tipul cererii către site (GET, POST, HEAD).
SCRIPT_FILENAME— calea completă către fișierul sau adresa solicitate.
PATH_INFO— date care au fost transferate în script.
ȘIR DE INTEROGARE— un șir transmis ca solicitare către scriptul CGI, parametrii GET.
AUTH_TYPE— tipul de identificare a utilizatorului.
DOCUMENT_ROOT— calea către directorul rădăcină al serverului.
SERVER_ADMIN— e-mailul administratorului serverului.
NUMELE SERVERULUI— adresa serverului (nume), dată de comanda gazdă.
SERVER_ADDR— IP-ul site-ului dvs.
SERVER_PORT— portul pe care rulează Apache.
SERVER_PROTOCOL— versiunea protocolului http.
SERVER_SOFTWARE— versiunea de Apache folosită.
TIME_YEAR, TIME_MON, TIME_DAY, TIME_HOUR, TIME_MIN, TIME_SEC, TIME_WDAY, TIME- timp.
API_VERSION— Versiunea API a modulului Apache.
CEREREA— linia conține întreaga cerere http trimisă de browser către server (GET /index.html HTTP/1.1). Anteturile suplimentare nu sunt incluse aici.
REQUEST_URI— adresa solicitată în antetul http.
REQUEST_FILENAME— calea completă către fișierul solicitat, conține de fapt aceleași date ca SCRIPT_FILENAME.
IS_SUBREQ— verificați dacă există o subinterogare. Dacă da, răspunsul este adevărat, dacă nu, răspunsul este fals.
Puteți afla cu ușurință lista variabilelor serverului dvs. plasând un fișier php cu codul în rădăcina site-ului:

Introducând adresa acestui fișier în browser, în partea de jos a paginii veți primi informații despre variabilele serverului.

8. Directiva RewriteOptions, detalii tehnice, când NU se folosește mod_rewrite

În părțile anterioare le-am studiat aproape pe toate documentația mod_rewrite. Au rămas directive RescrieMapȘi RewriteOptions. RewriteMap este, de asemenea, folosit pentru a rescrie URL-uri, dar este folosit mai rar decât altele; Vom reveni la el mai târziu. Directivă RewriteOptions de asemenea, folosit rar. Caracteristică RescrieMap este că nu poate fi folosit în .htaccess. Poate fi folosit doar în contextul unui server sau al gazdelor virtuale. În general, RewriteMap nu adaugă funcționalități noi - vă permite doar să mutați o gamă largă de date care nu sunt practice sau prea dificil de descris folosind expresii regulate în fișiere separate. Se obțin astfel de baze de date dedicate. Cu toate acestea, vom lua în considerare în continuare RescrieMapîntr-una din părțile ulterioare.

Acum, pentru a consolida teoria pe care am învățat-o, vom trece la exemple practice ale celor mai comune utilizări ale mod_rewrite, inclusiv o descriere detaliată a modului în care funcționează. Dacă după ce te-ai familiarizat cu teoria și aceste exemple mai ai întrebări, atunci scrie-le aici în comentarii.

Vă rugăm să rețineți că multe dintre exemple folosesc căi de fișiere specifice, valori de interogare etc. - aceste exemple nu vor funcționa pentru dvs. fără modificări ale configurației serverului dvs., așa că este important să le înțelegeți și să nu le copiați pur și simplu în configurația dvs.

Se verifică disponibilitatea mod_rewrite

Cum să activați RewriteEngine

Activarea modulului mod_rewrite în fișierul de configurare Apache a fost discutată în . Dacă modulul este activat, atunci trebuie activat în fișier .htaccess directivă:

RewriteEngine Pornit

Trebuie să faceți acest lucru o singură dată, chiar dacă utilizați mai multe reguli de rescriere.

Pentru ca modulul să funcționeze, trebuie activată și opțiunea UrmărițiSymLinks. Această opțiune poate fi activată în fișierul de configurare Apache (acesta a fost deja discutată în prima parte). Dacă această opțiune este dezactivată la nivel de server web (sau gazdă virtuală), atunci poate fi activată în fișierul .htaccess. Trebuie specificat înainte de directivă RewriteEngine:

Opțiuni +FollowSymLinks RewriteEngine Activat

Cum se verifică dacă mod_rewrite este activat

Cum se verifică dacă mod_rewrite este activat sau nu în PHP

Cel mai simplu mod este să utilizați funcția phpinfo(). Dacă modulul este activat, atunci în tabel apache2handlerîntr-o coloană Module încărcate va fi indicat mod_rewrite(precum și toate celelalte module care sunt incluse).

Această metodă este cea mai universală: o poți folosi pe orice sistem, inclusiv pe găzduire partajată.

Cum să verificați dacă mod_rewrite este activat pe Windows

Deschideți promptul de comandă ( Win+x, apoi selectați Windows PowerShell). Accesați directorul în care se află fișierele binare Apache. De exemplu, în cazul meu, acesta este folderul C:\Server\bin\Apache24\bin\:

Cd C:\Server\bin\Apache24\bin\

Și rulați comanda acolo:

./httpd.exe -M

Va fi afișată o listă completă de module.

Cum se verifică dacă mod_rewrite este activat pe Linux

Pentru a lista toate modulele încărcate de serverul web Apache, utilizați opțiunea -M. Fișierul executabil de server web poate fi apelat apache2ctl sau httpdîn funcţie de distribuţia utilizată.

Pentru Debian, Ubuntu, Kali Linux, Linux Mint și derivatele lor, comanda pentru a lista modulele este următoarea:

Apache2ctl -M

Pentru Arch Linux, BlackArch și alte distribuții comanda este:

Httpd-M

Verificarea dacă mod_rewrite este activat folosind .htaccess

În dosar .htaccess notează directiva:

RewriteEngine activat

Și încercați să deschideți adresa folderului în care ați salvat .htaccess, dacă apare eroarea „500 Internal server error” înseamnă modulul mod_rewrite Nu activat în fișierul de configurare Apache.

Cum să faci regulile de rescriere să fie utilizate numai dacă mod_rewrite este activat

Proiecta verifică dacă modulul este activat. Dacă modulul este activat, atunci directivele care se află în secțiune sunt executate . Dacă modulul este dezactivat, aceste directive sunt ignorate. Ca rezultat, dacă modulul este dezactivat, directivele necunoscute nu vor provoca o eroare de server web.

Sintaxa de utilizare:

…… ……

În loc de elipse, notați directivele mod_rewrite dorite, de exemplu:

RewriteEngine On RewriteCond %(HTTP_USER_AGENT) ^HTTrack RewriteCond %(HTTP_USER_AGENT) ^sqlmap RewriteCond %(HTTP_USER_AGENT) ^wpscan RewriteCond %(HTTP_USER_AGENT) ^text RewriteRule ^.* - [F]

Înainte de numele modulului puteți pune ! (punct de exclamare) și apoi ce este înăuntru IfModule va fi executat numai dacă modulul verificat NU este activat.

Secțiuni poate fi folosit în interiorul unei alte secțiuni și efectuați teste simple ale mai multor module în funcție de starea testelor de module anterioare.

Această secțiune ar trebui utilizată numai dacă aveți nevoie de un singur fișier de configurare care funcționează indiferent dacă un anumit modul este disponibil. În funcționarea normală, directivele nu trebuie plasate în secțiuni .

Utilizarea mod_rewrite pentru a redirecționa și redirecționa adresele URL

Pagina și-a schimbat adresa, cum să afișați o pagină nouă la vechea adresă fără redirecționare

Descriere:

Să presupunem că recent am redenumit pagina foo.html în bar.html și că acum dorim ca vechea adresă URL să funcționeze și pentru compatibilitate cu versiunea anterioară. Cu toate acestea, dorim să ne asigurăm că utilizatorii vechii URL nici măcar nu știu că paginile au fost redenumite, ceea ce înseamnă că nu dorim ca adresa să se schimbe în browserul lor.

Folosim RewriteRule pentru a transforma o solicitare care conține o adresă veche într-una nouă, setând următoarea regulă:

RewriteEngine pe RewriteRule „^/foo\.html$” „/bar.html”

În acest exemplu ^/foo\.html$ este o expresie regulată. Simboluri ^ Și $ indica începutul și, respectiv, sfârșitul unei linii. Punctul este precedat de o bară oblică, astfel încât caracterul este tratat literal (ca punct) și nu ca wildcard (ca wildcard, un punct înseamnă orice caracter).

Pagina și-a schimbat adresa, cum se redirecționează către o pagină nouă când se solicită una veche (redirecționare)

Descriere:

Să presupunem din nou că am redenumit recent pagina foo.html în bar.html și din nou dorim ca vechea adresă URL să funcționeze pentru compatibilitate cu versiunea inversă. Dar de data aceasta dorim ca utilizatorii vechiului URL să obțină un indiciu despre cel nou, ceea ce înseamnă că bara de adrese a browserului lor ar trebui să se schimbe.

Forțăm o redirecționare HTTP către noua adresă URL, ceea ce face ca adresa paginii din browser să se schimbe și, prin urmare, ceea ce este afișat utilizatorului:

RewriteEngine pe RewriteRule „^/foo\.html$” „bar.html” [R]

Apropo, pentru cazuri simple de redirecționare puteți folosi directiva Redirecţiona. Această directivă nu ar putea înlocui primul exemplu, când arătăm conținutul unei alte pagini fără a schimba adresa (fără redirecționare). CU Redirecţiona al doilea exemplu ar arăta astfel:

Redirecționare „/foo.html” „/bar.html”

Redirecționare la schimbarea domeniului

Descriere:

Dacă site-ul și-a schimbat domeniul, dar a păstrat aceeași structură a paginii. Doriți ca vechile adrese URL să continue să funcționeze până când utilizatorii își actualizează marcajele.

Puteți folosi mod_rewrite pentru a redirecționa aceste adrese URL către noul domeniu, dar luați în considerare și utilizarea directivelor Redirecţiona sau RedirectMatch.

În următoarele exemple, înlocuiți example.com cu adresa site-ului unde ar trebui să se facă redirecționarea.

# Cu mod_rewrite RewriteEngine pe RewriteRule „^/docs/(.+)” „http://new.example.com/docs/$1”

Regula înseamnă să găsiți interogări care conțin un șir care începe cu /docs/(simbol ^ înseamnă începutul liniei și /docs/ este o secvență literală de caractere) care este apoi urmată de orice (un punct înseamnă orice caracter, iar un semn plus înseamnă una sau mai multe ori). Parantezele formează un backlink. Acestea. ceea ce se potrivește cu expresia din paranteze poate fi folosit mai târziu prin referirea acesteia cu $1 .

În linia de rescriere http://new.example.com/docs/ este partea literală și $1 - aceasta este ceea ce a coincis cu partea expresiei din paranteze, i.e. link înapoi către (.+) .

Astfel, dacă a fost făcută o solicitare către http://another.com/docs/best, se va face o redirecționare către http://new.example.com/docs/best.

# Cu RedirectMatch RedirectMatch „^/docs/(.*)” „http://new.example.com/docs/$1” # Cu Redirect Redirect „/docs/” „http://new.example.com/docs /"

Directive RedirecţionaȘi RedirectMatch ar trebui să fie „mai ușor” pentru server, dar cazurile complexe nu pot fi descrise întotdeauna fără a utiliza mod_rewrite.

Redirecționare simplă către un site nou

Dacă site-ul și-a schimbat domeniul și nu și-a menținut structura paginii, de ex. dacă trebuie să redirecționați toate solicitările către un site nou (de exemplu, către pagina principală), atunci acest lucru se face astfel:

RewriteEngine pe RewriteRule ^ https://newsite.ru

Drept urmare, indiferent de pagina solicitată, toate solicitările vor fi redirecționate către pagina de pornire a celuilalt domeniu. Înlocuiți https://newsite.ru cu site-ul unde redirecționați solicitările.

Cum să redirecționați toate cererile dintr-un director în altul

Alias ​​pentru un singur director:

RewriteEngine On RewriteRule ^sursă-directory/(.*) /target-directory/$1

Toate apelurile către conținutul directorului-sursă vor fi redirecționate către conținutul directorului-țintă.

Utilizați adrese URL fără extensia de fișier .php

Acest fragment vă permite să utilizați o adresă URL fără o extensie PHP, de exemplu example.com/users în loc de example.com/users.php.

RewriteEngine On RewriteCond %(SCRIPT_FILENAME) !-d RewriteRule ^([^.]+)$ $1.php

Documentul de eroare generic pentru resurse nu a fost găsit (eroare 404 negăsit)

Următoarea regulă tipărește fișierul pe care îl specificați dacă apare o eroare 404 Not Found. Vă rugăm să rețineți că trebuie să specificați codul corect de răspuns HTTP 404 în antetele răspunsului (în codul PHP, de exemplu).

RewriteEngine On RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule ^ /dir/error.php

Dacă această regulă de rescriere provoacă o eroare de server, înlocuiți marcajul cu . Indicatorul funcționează mai bine, dar este acceptat de Apache 2.4 și nu este acceptat de Apache 2.2.

În loc de /dir/error.php trebuie să specificați calea către fișierul pe care doriți să-l afișați în cazul unei erori 404 (fișierul nu a fost găsit).

De la statică la dinamică

Descriere:

Cum putem transforma o pagină foo.html statică într-o pagină foo.cgi dinamică într-o manieră fără întreruperi, de ex. fără a anunța browserul/utilizatorul.

Pur și simplu rescriem URL-ul într-un script CGI și forțăm ca handlerul să fie un script CGI, astfel încât să ruleze ca un program CGI. Astfel, o solicitare pentru /~quux/foo.html va avea ca rezultat un apel intern către /~quux/foo.cgi.

RewriteEngine pe RewriteBase „/~quux/” RewriteRule „^foo\.html$” „foo.cgi”

Compatibilitate inversă pentru modificările extensiilor de fișiere

Descriere:

Cum putem face URL-urile (practic încă existente) compatibile înapoi după migrarea document.YYYY la document.XXXX, de exemplu, după migrarea unui număr de fișiere .html la .php?

Rescriem numele în numele său de bază și verificăm dacă există un fișier cu noua extensie. Dacă există, o luăm, altfel URL-ul este folosit așa cum este.

# un set de reguli pentru compatibilitatea inversă # pentru a rescrie document.html în document.php # numai atunci când document.php există RewriteEngine pe RewriteBase "/var/www/htdocs" RewriteCond "$1.php" -f RewriteCond "$1.html" !-f RewriteRule "^(html$" "$1.php"

Discuţie

Acest exemplu profită de o caracteristică mod_rewrite, adesea trecută cu vederea, care apare din ordinea în care este executat setul de reguli. Mai exact, mod_rewrite evaluează partea stângă a RewriteRule (Search Pattern) înainte de a evalua directivele RewriteCond. Prin urmare, $1 este deja definit în momentul în care directivele RewriteCond sunt evaluate. Acest lucru ne permite să verificăm prezența unui fișier sursă (document.html) și a unui fișier țintă (document.php) folosind același nume de fișier de bază.

Acest set de reguli este destinat utilizării în contextul directoarelor (în blocul sau în fișierul .htaccess), astfel încât verificările -f să caute directorul în calea corectă. Poate fi necesar să setați directiva RewriteBase pentru a specifica baza de director în care lucrați.

Înlocuirea imaginilor cu WebP

Dacă imaginile WebP sunt acceptate și o imagine cu extensia de fișier .webp este găsită în aceeași locație în care se află o imagine jpg/png pe server, atunci imaginea WebP va fi trimisă.

RewriteEngine On RewriteCond %(HTTP_ACCEPT) imagine/webp RewriteCond %(DOCUMENT_ROOT)/$1.webp -f RewriteRule (.+)\.(jpe?g|png)$ $1.webp

Nume de gazdă și adrese URL canonice. HTTPS

Aceeași pagină poate fi accesată în moduri diferite. De exemplu, puteți deschide pagina de pornire a site-ului utilizând oricare dintre următoarele metode:

  • http://www.yoursite.com/
  • http://yoursite.com/
  • http://www.yoursite.com
  • http://yoursite.com
  • http://www.yoursite.com/index.php
  • http://yoursite.com/index.php
  • http://yoursite.com/?

Pot exista și mai multe opțiuni dacă site-ul este disponibil atât pe HTTP, cât și pe HTTPS. De asemenea, pot apărea variații din cauza diferitelor erori de conectare, în care pagina continuă să se deschidă. De exemplu:

  • http://www.yoursite.com//index.php

Deși majoritatea oamenilor înțeleg că toate aceste URL-uri sunt același lucru, din punct de vedere tehnic nu sunt. Pentru serverul web, acestea sunt URL-uri diferite. Și dacă sunt deschise, motoarele de căutare le pot indexa.

Motoarele de căutare au devenit mult mai avansate, dar nu ar trebui să te bazezi doar pe ele pentru a combate paginile duplicate. În plus, acest lucru poate provoca confuzie în analiză (când pentru fiecare dintre exemplele enumerate, veniturile sau traficul sunt luate în considerare separat, deși aceasta este aceeași pagină).

Prin urmare, webmasterul ar trebui să aibă grijă de URL-ul canonic. De fapt, nu are nicio diferență ce formă de URL alegeți să fie canonică. Principalul lucru este să alegi un lucru și să te ții de el.

Cum se redirecționează de la HTTP la HTTPS

Amintiți-vă că pentru a utiliza protocolul HTTPS nu este suficient doar să faceți o redirecționare trebuie configurat și serverul web. Adică trebuie să obțineți certificate și să le specificați în setările gazdei. De asemenea, serverul web trebuie configurat să asculte pe portul 443. Dacă totul este gata, atunci redirecționați către HTTPS, către fișier .htaccess adăugați rândurile:

RewriteEngine on RewriteCond %(HTTPS) !on RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI)

În acest exemplu, variabila %(HTTPS) conţine pe, dacă site-ul folosește HTTPS și conține oprit, dacă se utilizează HTTP. Astfel, adresa paginii este rescrisă doar dacă este accesată prin HTTP.

ÎN RewriteRule folosit ca model de căutare ^ – caracterul începutului unui rând. Acestea. Toate rândurile se încadrează în această condiție. Ținta de redirecționare este specificată folosind un șir literal https://și două variabile de mediu %(HTTP_HOST)Și %(REQUEST_URI).

Strict-Transport-Securitate: max-age=31536000; include SubDomains

Cum să redirecționați de la HTTP la HTTPS toate paginile, cu excepția unora

Să presupunem că trebuie să transferăm toate paginile pe HTTPS, cu excepția celor aflate în folder /.bine cunoscute/, atunci se folosește următoarea construcție:

RewriteEngine on RewriteCond %(HTTPS) !on RewriteCond %(REQUEST_URI) !^/.well-known/ RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI)

A inlocui /.bine cunoscute/ la adresa dorită a folderului sau a paginii.

Dacă trebuie să excludeți mai multe pagini sau directoare, atunci creați o expresie regulată cu o alegere alternativă, de ex. folosind o țeavă ( | ). De exemplu, trebuie să activați redirecționarea către HTTPS pentru toate paginile, cu excepția celor din folderul /.well-known/, din folderul /test/ și fișierul /stay-away.php:

RewriteEngine on RewriteCond %(HTTPS) !on RewriteCond %(REQUEST_URI) !^(/.well-known/|/test/|/stay-away.php) RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI)

Cum să redirecționați de la HTTP la HTTPS doar câteva pagini

Dacă trebuie să redirecționați numai pagini individuale de la HTTP la HTTPS, atunci exemplele prezentate mai devreme vor funcționa. Singura modificare necesară este eliminarea semnului de exclamare ( ! ), care servește la refuzul unui meci.

Pentru a configura o redirecționare către HTTPS numai pentru folderul /.well-known/

RewriteEngine on RewriteCond %(HTTPS) !on RewriteCond %(REQUEST_URI) ^/.well-known/ RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI)

Pentru a configura o redirecționare către HTTPS numai pentru folderul /.well-known/, folderul /test/ și fișierul /stay-away.php:

RewriteEngine on RewriteCond %(HTTPS) !on RewriteCond %(REQUEST_URI) ^(/.well-known/|/test/|/stay-away.php) RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI)

Forțați HTTPS în spatele unui proxy

Util dacă aveți un proxy în fața serverului dvs. care dezactivează TLS.

RewriteCond %(HTTP:X-Forwarded-Proto) !https RewriteRule (.*) https://%(HTTP_HOST)%(REQUEST_URI)

Utilizați întotdeauna WWW înaintea numelui de domeniu

Dacă doriți ca numele de domeniu să fie întotdeauna precedat de www, apoi utilizați următoarele reguli:

RewriteEngine on RewriteCond %(HTTP_HOST) ^example\.com RewriteRule ^(.*)$ http://www.example.com/$1

Rețineți că example.com trebuie înlocuit cu domeniul site-ului dvs., în loc de protocol http:// poate fi specificat https://, și în linie ^exemplu\.com Bara oblică dinaintea punctului nu este accidentală - această linie este o expresie regulată, astfel încât punctul nu este tratat ca un caracter wildcard, ci ca un punct literal, se folosește o bară oblică.

Utilizați întotdeauna WWW înaintea numelui de domeniu - opțiune universală

Această opțiune este potrivită fără modificări pentru niciun site: nu trebuie să specificați numele gazdei (numele de domeniu) și nici nu trebuie să indicați dacă se utilizează protocolul HTTP sau HTTPS. Acestea. aceasta este o opțiune mai versatilă.

RewriteEngine On RewriteCond %(HTTP_HOST) !="" RewriteCond %(HTTP_HOST) !^www\. RewriteCond %(HTTPS)s ^on(s)| RewriteRule ^ http%1://www.%(HTTP_HOST)%(REQUEST_URI)

Prima condiție verifică dacă valoarea este Gazdă gol (în cazul HTTP/1.0). Al doilea verifică dacă pornește Gazdă pe www..

fi atent la RewriteCond %(HTTPS)s ^on(s)|. Aici se folosește o tehnică destul de inteligentă. După cum am menționat mai sus, variabila de mediu %(HTTPS) conţine pe, dacă site-ul folosește protocolul HTTPS, și conține oprit, dacă este folosit HTTP. S-a adăugat o literă literală la variabila de mediu s, ca urmare, linia este verificată %(HTTPS)s, care, în funcție de dacă HTTPS sau nu, se poate reduce la ons sau offs. Acest șir este comparat cu o expresie regulată ^pe(e)|, Unde ^ este începutul unui caracter de linie. Simbol trompeta ( | ) indică faptul că orice alternativă va funcționa, fie înainte, fie după acest simbol. Acest caracter este precedat de linie pe(e), și apoi - nimic. Șirul gol se potrivește cu orice șir comparat. Pe baza acestui lucru, rezultatul RescrieCond va ajunge întotdeauna la adevăr. Dar în funcție de ce parte a expresiei regex s-a potrivit: pe(e) sau un șir gol, backlink-ul va fi " s„sau va fi un șir gol. Backlink-ul este specificat prin paranteze care conțin litera s.

Ca urmare http%1 la RewriteRule se va reduce la https sau la http.

Astfel, această regulă este potrivită pentru orice site nu trebuie să-ți înregistrezi domeniul în el, așa cum trebuie să faci în cel precedent. De asemenea, nu trebuie să vă faceți griji cu privire la protocolul site-ului.

Nu utilizați niciodată WWW înaintea unui nume de domeniu

daca tu nu este nevoie astfel încât să existe litere în fața domeniului în linia browserului www, apoi folosiți următoarea regulă:

RewriteEngine on RewriteCond %(HTTP_HOST) ^www\.example\.com RewriteRule ^(.*)$ http://example.com/$1

În el, înlocuiți http://example.com cu numele dvs. de domeniu. Acordați atenție și protocolului. A doua linie folosește bare oblice pentru a se asigura că punctele din expresia regulată sunt tratate ca caractere literale (mai degrabă decât metacaracterele).

Nu utilizați niciodată WWW înaintea unui nume de domeniu - o opțiune universală

daca tu trebuie sa scap de wwwîn bara de adrese a browserului, atunci următoarea regulă va face acest lucru, redirecționează solicitarea către o adresă similară, dar fără www:

RewriteEngine pe RewriteCond %(HTTP_HOST) ^www\. RewriteCond %(HTTPS)s ^on(s)|off RewriteCond http%1://%(HTTP_HOST) ^(https?://)(www\.)?(.+)$ RewriteRule ^ %1%3% (REQUEST_URI)

În acest set de condiții și reguli, nu trebuie să specificați domeniul dvs. - designul este universal pentru orice site și este potrivit și pentru site-uri pe HTTP și HTTPS.

Forțați numele canonic cu HTTPS și www

Dacă site-ul dvs. rulează prin HTTPS și ați ales să utilizați www înaintea numelui de domeniu ca nume canonic, atunci oricare dintre următoarele reguli vă va ajuta. Nu există nicio diferență fundamentală între ele, dacă unul dintre ele nu este potrivit pentru condițiile tale, încearcă doar altul.

Prima cale:

RewriteEngine On RewriteCond %(HTTPS) off RewriteRule .* https://%(HTTP_HOST)%(REQUEST_URI) RewriteCond %(HTTP_HOST) !^www\. RewriteRule .* https://www.%(HTTP_HOST)%(REQUEST_URI)

În acest exemplu există două reguli de rescriere. Primul redirecționează către HTTPS. A doua regulă rescrie orice solicitare cu un domeniu invalid de a utiliza www. Steagul înseamnă o potrivire indiferent de caz.

A doua cale:

RewriteEngine On RewriteCond %(HTTP_HOST) (?!^www\.)^(.+)$ RewriteCond %(HTTPS) off RewriteRule ^ https://www.%1%(REQUEST_URI)

A treia cale:

RewriteEngine pe RewriteCond %(HTTP_HOST) !^$ RewriteCond %(HTTP_HOST) !^www\. RewriteCond %(HTTPS)s ^on(s)| RewriteRule ^ http%1://www.%(HTTP_HOST)%(REQUEST_URI) RewriteCond %(HTTPS) off RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI)

A patra metodă (înlocuiește domain.ru cu domeniul tău):

RewriteEngine On RewriteCond %(HTTP_HOST) !^www\.domain\.ru RewriteRule ^(.*)$ https://www.domain.ru/$1 RewriteCond %(SERVER_PORT) 80 RewriteRule ^(.*)$ https:/ /www.domain.ru/$1

Vedere canonică cu HTTPS și fără www

Dacă site-ul dvs. rulează pe HTTPS, dar nu doriți să vedeți wwwîn bara de adrese a browserului dvs. înainte de numele domeniului, apoi utilizați:

RewriteEngine on RewriteCond %(HTTPS) !on RewriteRule ^ https://%(HTTP_HOST)%(REQUEST_URI) RewriteCond %(HTTP_HOST) ^www\. RewriteCond %(HTTPS)s ^on(s)|off RewriteCond http%1://%(HTTP_HOST) ^(https?://)(www\.)?(.+)$ RewriteRule ^ %1%3% (REQUEST_URI)

SSL forțat și www pentru domeniul principal, SSL forțat fără www pentru toate subdomeniile (cu excepția celor locale)

RewriteEngine On # pentru subdomenii: ssl forțat și fără www RewriteCond %(HTTP_HOST) !\.local$ RewriteCond %(HTTPS) !=on RewriteCond %(HTTP_HOST) !^(www\.)?domeniu\.ru$ RewriteCond %( HTTP_HOST) ^(?:www\.|)(.*)$ RewriteRule ^.*$ https://%1%(REQUEST_URI) # pentru domeniile principale: forțați ssl fără www RewriteCond %(HTTP_HOST) !\.local$ RewriteCond %(HTTPS) !=on RewriteCond %(HTTP_HOST) ^domeniu\.ru$ RewriteRule ^.*$ https://www.domain.ru%(REQUEST_URI)

Înlocuiește domain.ru cu numele tău de domeniu.

Forțați adăugarea unei bare oblice la adresa site-ului

Dacă trebuie să adăugați o bară oblică finală la adresa URL (dacă lipsește), atunci utilizați această regulă de rescriere:

RewriteEngine on RewriteCond %(REQUEST_FILENAME) !-f RewriteRule ^(.*[^/])$ /$1/

Eliminarea unei bare oblice

Acest fragment va redirecționa căile care se termină în bare oblice către căi similare fără bară oblică finală (cu excepția directoarelor reale), de exemplu http://www.example.com/blog/ la http://www.example.com/blog. Acest lucru este important pentru SEO, deoarece este recomandat să aveți o adresă URL canonică pentru fiecare pagină.

Dacă trebuie să eliminați bara oblică finală din URL, atunci utilizați:

RewriteEngine on RewriteCond %(REQUEST_FILENAME) !-d RewriteRule ^(.*)/$ /$1

Eliminarea barelor oblice de pe căile arbitrare

Eliminarea barelor oblice finale din adresele URL pentru site-urile web găzduite într-un director (cum ar fi example.org/blog/):

RewriteEngine on RewriteCond %(REQUEST_FILENAME) !-d RewriteCond %(REQUEST_URI) (.+)/$ RewriteRule ^ %1

Eliminarea barelor oblice suplimentare dintr-o adresă URL

De exemplu, pagina /catalog///stranica.html este accesibilă și se deschide. Pentru a evita această situație și pentru a nu crea un număr nesfârșit de duplicate, ar trebui să scrieți următoarea redirecționare:

RewriteEngine pe RewriteBase / RewriteCond %(HTTP_HOST) !="" RewriteCond %(THE_REQUEST) ^+\s//+(.*)\sHTTP/+$ RewriteCond %(THE_REQUEST) ^+\s(.*)//+ \sHTTP/+$ RewriteRule .* http://%(HTTP_HOST)/%1 RewriteCond %(REQUEST_URI) ^(.*)//(.*)$ RewriteRule . %1/%2

Aici, două reguli sunt folosite în succesiune pentru a elimina mai multe bare oblice din orice parte a adresei URL: început, mijloc, sfârșit.