Puncte:1

htaccess rescrie numai în directorul rădăcină (generic)

drapel ht

Salut, încerc să fac htaccess să rescrie numai dacă nu există un fișier, un link simbolic sau un director cu acest nume. Ceea ce am făcut cu succes cu asta chiar aici:

RewriteCond %{REQUEST_FILENAME} -s [SAU]
RewriteCond %{REQUEST_FILENAME} -l [SAU]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+) - [PT,L]
RewriteRule ^(.*)$ index\.php?var=$1 [QSA,L]

Funcționează perfect, totuși, vreau ca acest lucru să apară doar în directorul rădăcină, nu în niciun subdirectoare. Cum pot realiza acest lucru într-un mod generic (adică nu vreau să precizez în mod explicit adresa URL în fișierul .htaccess)?

Puncte:1
drapel kz

Pentru a preveni procesarea oricăror directive mod_rewrite pentru cereri în afara rădăcinii documentului, plasați următoarea regulă în partea de sus a fișierului:

# Preveniți procesarea ulterioară dacă cererea se află în afara directorului rădăcină
RewriteRule / - [L]

Cele de mai sus afirmă practic că pentru orice cale URL solicitată care conține o bară oblică, atunci opriți-vă aici. (Acest lucru va prinde și cererile care se termină cu o bară oblică - este o problemă?)


Alternativ, puteți face expresia regex pentru cele două reguli existente mai precisă, astfel încât să se aplice numai cererilor din directorul rădăcină.

De exemplu:

# Aplicați reguli numai cererilor din directorul rădăcină
RewriteCond %{REQUEST_FILENAME} -s [SAU]
RewriteCond %{REQUEST_FILENAME} -l [SAU]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^[^/]+$ - [L]
RewriteRule ^([^/]*)$ index.php?var=$1 [QSA,L]

The PT steag de pe prima regulă nu este necesar. Și nici grupul de captură din prima regulă nu este necesar. Puncte literale în substituţie șirul nu trebuie să fie scapat de bară oblică inversă.

NB: De asemenea, acest lucru nu va procesa cererile care Sfârşit cu o tăietură.


Totuși, dacă acestea sunt singurele tale reguli care au legătură cu asta, atunci nu le faci nevoie două reguli, doar una este necesară, cu condiția ca cererile către rădăcina documentului în sine să lipsească var parametru URL. De exemplu:

DirectoryIndex index.php

RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)$ index.php?var=$1 [QSA,L]

Rețineți că logica conditii este inversat.

După cum am menționat, cererile pentru directorul rădăcină în sine vor ajunge la index.php (prin mod_dir), nu index.php?var=.

tony avatar
drapel ht
Răspuns excelent, mulțumesc pentru răspunsul detaliat. Întrebare ulterioară: ce se întâmplă dacă aș vrea să procesez și cererile care se termină cu o bară oblică, atâta timp cât acel director nu există. este posibil?

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.