Puncte:1

.htaccess Eliminați primul parametru URL php dacă există al doilea

drapel cn

Acesta este codul meu .htaccess:

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Rescrie regula ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

*unde $1 = profil și $3 = john-smith

Aceasta funcționează bine la rescrierea https://example.com/profile/john-smith dar am nevoie de o a doua regulă de rescriere, cum ar fi https://example.com/john-smith numai dacă al doilea parametru care conține john-smith există.

Mulțumesc!

UPDATE: (Regulile complete ale fișierului meu .htaccess)

# protejați fișierele începând cu .
RewriteRule /\.(.*) - [NC,F]

# redirecționează HTTPS
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

# Fără acces rădăcină fără index.* și altă securitate
RewriteEngine Pornit
Opțiuni Toate -Indici
RewriteBase /
DirectoryIndex index.php index.html index.htm
ErrorDocument 404 https://example.com/pages.php?PAGE=404

# Preveniți încărcarea fișierelor PHP rău intenționate
<FilesMatch â\.(php|php\.)$â> 
Comanda Permite, Refuza 
Negați de la toți 
</FilesMatch>

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]

RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Rescrie regula ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [QSA, L]
drapel kz
Puteți explica în limbaj natural exact ceea ce încercați să faceți. adică. Adresele URL solicitate și adresele URL țintă așteptate? Nu există „parametri URL” în cele două exemple de adrese URL pe care le-ați indicat („parametrii URL” sunt prezenți doar în adresa URL la care se rescrie). „Am nevoie de o a doua regulă de rescriere precum `https://example.com/john-smith` numai dacă există al doilea parametru care conține john-smith” - Nu există un „al doilea parametru” în acea adresă URL, există doar o singură cale segment_ `john-smith`?
Adrian avatar
drapel cn
Structura URL-ului original dinaintea codului meu htaccess arată astfel: https://example.com/pages.php?PAGE=profile&LINK=john-smith. Numai că trebuie să fac acum este să elimin primul parametru (PAGE=profile) când există al doilea, pentru că am situații când există doar primul parametru.
drapel kz
Deci, atunci când vine o solicitare pentru `example.com/john-smith` (adică doar un segment de cale și fără bară oblică) ar trebui să rescrie cererea în `/pages.php?LINK=john-smith`?
Adrian avatar
drapel cn
Da, exact...
Puncte:0
drapel kz
Rescrie regula ^([^/]+)(/([^/]+))? pages.php?PAGE=$1&LINK=$3 [L]

„Problema” cu aceasta este că se va potrivi și cu o solicitare pentru /John Smith (al 2-lea grup este opțional), dar rescrie cererea către pages.php?PAGE=john-smith&LINK=, în loc de pages.php?LINK=john-smith după cum este necesar. Pentru aceasta veți avea nevoie de o regulă separată. Se potrivește și /profil/john-smith/orice, aruncând /orice dar totuși rescrie cererea (o relație de mai multe la unu) care poate deschide site-ul dvs. pentru spammeri.

Presupunând că nu permiteți puncte (.) în segmentele de cale URL (conform exemplelor dvs.), atunci nu este nevoie să verificați dacă solicitarea nu se mapează la un fișier. de exemplu. o cerere pentru /profil/john-smith nu ar putea niciodată mapa la fișier dacă fișierele dumneavoastră au toate extensii de fișiere, deci verificarea sistemului de fișiere este redundantă.

Încercați următoarele:

# Rescrie exact un segment de cale
# de exemplu. /john-smith la pages.php?LINK=john-smith
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)$ pages.php?LINK=$1 [L]

# Rescrie exact două segmente de cale
# de exemplu. /profile/john-smith la pages.php?PAGE=profile&LINK=john-smith
RewriteCond %{REQUEST_URI} !^/pages/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/.]+)/([^/.]+)$ pages.php?PAGE=$1&LINK=$2 [L]

The NC steag pe precedent RescrieCond directiva este probabil redundantă.

([^/.]+) - Am schimbat submodelul de captare pentru a exclude și punctele. Și a doua regulă se potrivește exact două segmente de cale, nu unul sau două segmente de cale, ca în exemplul dvs.

Adrian avatar
drapel cn
Vă mulțumesc mult pentru răspuns! Din nefericire, soluția ta nu funcționează în situația mea... Codul „segment în două părți” funcționează numai dacă schimb $ cu ? si fara punct. „Segmentul cu o singură parte” nu funcționează deloc.
drapel kz
@Adrian Ce vrei să spui prin „nu funcționează”? Ce se întâmplă exact? Primiți o eroare? Ce răspuns vezi? Dacă „segmentul din două părți” funcționează numai dacă îl schimbați, atunci se potrivește cu ceva diferit de exemplele de adrese URL, așa cum este menționat. Ce alte directive mai aveți în acest fișier `.htaccess`? Vă rugăm să vă editați întrebarea pentru a include fișierul complet `.htaccess` cu aceste directive - este posibil să aveți un conflict. Și unde se află acest fișier `.htaccess`? Aveți alte fișiere `.htaccess`?
Adrian avatar
drapel cn
Tocmai mi-am actualizat întrebarea cu regulile complete ale fișierului meu .htaccess. Deci, fișierul htaccess se află în același folder cu pages.php și este singurul pe care îl am. Nu este o eroare specială pentru regulile „segment dintr-o parte”. De fapt, rezultatul arată ca o pagină pierdută cu câteva fragmente din antetul și subsolul meu, care nu arată conținutul potrivit, deoarece se încarcă atunci când accesez fără url-ul rescris.

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.