Puncte:1

Rescrierea regulii pentru adresa URL cu interogare nu funcționează

drapel cn

Scriu următoarea regulă de rescriere:

<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} rp=\/knowledgebase\/.*
RewriteRule ^\/customer\/index.php /knowledgebase/ [R=301,L]
RewriteRule ^\/customer\/knowledgebase\.php$ /knowledgebase/ [R=301,L,QSA]
</IfModule>

Pentru a redirecționa adresa URL, cum ar fi

https://www.example.com/customer/index.php?rp=/knowledgebase/5/DataNumen-Excel-Repair la https://www.example.com/knowledgebase/

Și redirecționare URL, cum ar fi

https://www.example.com/customer/knowledgebase.php la https://www.example.com/knowledgebase/

Dar ambele nu funcționează. De ce?

Actualizați

Încerc să pun codurile lui MrWhite de la /.htaccess la /customer/.htaccess și să fac câteva modificări minore pentru a adopta modificările, ca mai jos:

RewriteCond %{QUERY_STRING} rp=/knowledgebase/
RewriteRule ^index\.php$ https://www.example.com/knowledgebase/ [QSD,R=301,L,NC]

RewriteRule ^knowledgebase\.php$ https://www.example.com/knowledgebase/ [R=301,L,NC]

Acum redirecționarea funcționează. Cu toate acestea, va funcționa numai pentru cazuri precum:

https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair

dar pentru cazuri ca

https://www.example.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair

Nu va merge. Chiar și după ce schimb ^rp= în rp în RewriteCond.

Puncte:1
drapel kz

RewriteRule ^/customer/index.php /knowledgebase/ [R=301,L]

În .htaccess, calea URL potrivită de RewriteRule model (adică ^\/client\/index.php) nu începe cu o bară oblică, așa că nu se va potrivi niciodată.Calea URL care este potrivită este relativă la director care contine .htaccess fișier (mai puțin prefixul barei oblice). (Spre deosebire de când este folosit într-un Server context, când calea URL care este potrivită este calea URL-relativă a rădăcinii documentului, începând cu o bară oblică.)

Veți avea nevoie și de QSD steag pe prima regulă să arunca șirul de interogare din cererea inițială, în caz contrar, acesta este transmis așa cum este.

Punct minor... nu este nevoie să faceți backslash-slash-uri în regex Apache, deoarece spatii sunt delimitatorul de argument și bara oblică nu are nicio semnificație specială altfel în regex.

Încercați următoarele:

RewriteEngine Pornit

RewriteCond %{QUERY_STRING} ^rp=/knowledgebase/
RewriteRule ^customer/index\.php$ /knowledgebase/ [QSD,R=301,L]

RewriteRule ^customer/knowledgebase\.php$ /knowledgebase/ [R=301,L]

Am ancorat șirul de interogare în condiție deci se potriveste rp=... la începutul șirului de interogare, ca în exemplul dvs. The .* la sfârșitul expresiei regex nu este necesar.

The QSA flag nu este necesar pentru a doua regulă, deoarece șirul de interogare este transmis în mod implicit. The QSA steag ar fi necesar doar dacă ai nevoie combina șirul de interogare original la cerere cu un șir de interogare nou pe care îl atașați în fișierul substituţie.

The <IfModule> wrapper nu este necesar, cu excepția cazului în care aceste directive sunt opțional și destinat să fie utilizat pe mai multe servere unde mod_rewrite ar putea să nu fie disponibil. Vedeți această întrebare pe stiva de webmasteri: https://webmasters.stackexchange.com/questions/112600/is-checking-for-mod-write-really-necessary

Ar trebui să testați mai întâi cu redirecționări 302 (temporare) pentru a evita potențialele probleme de cache.


ACTUALIZAȚI: pentru a simplifica lucrurile, am pus regulile de rescriere la .htaccess dosar sub /client în loc de /. Mi-am actualizat postarea în consecință.

În acest caz, ar trebui să eliminați client/ prefix pe fiecare dintre RewriteRule modele, așa cum ați făcut în întrebarea dvs. actualizată.

Dacă rp Parametrul URL este destinat să se potrivească oriunde în șirul de interogare, atunci ar trebui să schimbați CondPattern a citi (^|&)rp=/bază de cunoștințe/, în loc să eliminați pur și simplu ^ prefix. Prin eliminarea ^ prefix cu care potriviți prea mult, de ex. abcrp=/bază de cunoștințe/... s-ar potrivi, de asemenea, deși aceasta poate fi sau nu o problemă în realitate.

În caz contrar, acele directive actualizate arată OK, în funcție de orice alte conflicte care ar putea exista cu alte directive. Memorarea în cache ar putea fi, de asemenea, o problemă, mai ales dacă utilizați CDN.

alancc avatar
drapel cn
Îmi pare rău, dar încă nu funcționează. Mulțumesc foarte mult.
drapel kz
@alancc Ce vrei să spui exact prin „nu funcționează”? Primiți o eroare? Redirecționare incorectă? Nimic? Unde se află fișierul tău `.htaccess`? Ai alte directive? Alte fișiere `.htaccess`?
alancc avatar
drapel cn
@MrWrite, Vă mulțumesc foarte mult. „Nu funcționează” înseamnă că atunci când introduc adresa URL, cum ar fi https://www.example.com/customer/index.php?rp=/knowledgebase/9/DataNumen-PDF-Repair, atunci nu se întâmplă nimic.Verific codul de răspuns și arată 200. Bănuiesc că se poate datora multiplelor fișiere .htaccess, așa că pentru a simplifica lucrurile, am pus regulile de rescrire în fișierul .htaccess sub /client în loc de /. Mi-am actualizat postarea în consecință.
drapel kz
@alancc Directivele așa cum sunt scrise în răspunsul meu sunt destinate să meargă în fișierul rădăcină `.htaccess`. Dacă le puneți în subdirectorul `/client`, atunci va trebui să le modificați așa cum ați făcut în întrebarea dvs. actualizată. Directivele din întrebarea dvs. actualizată arată OK (după ce a fost eliminat prefixul `^` pentru a se potrivi cu a doua adresă URL - deși acum probabil că se potrivește prea mult). Totuși, aveți alte directive în fișierul `/customer/.htaccess`? Orice redirecționare externă ca aceasta trebuie să meargă aproape de partea de sus. Mai multe fișiere `.htaccess` pot fi problematice. Folosiți _moștenirea_ de rescriere?
alancc avatar
drapel cn
Mulțumesc foarte mult. Verific de două ori /customer/.htaccess, după regula mea de rescriere, există AddHandler care este generat de cPanel automat. Și aceasta este ultima declarație din .htaccess. Adresa URL reală este https://www.datanumen.com/customer/index.php?a=b&c=d&rp=/knowledgebase/9/DataNumen-PDF-Repair, deși acum Cloudflare este activat, am încercat când este dezactivat și, de asemenea, nu funcționează.
drapel kz
@alancc Văd că URL-ul acum pare să redirecționeze așa cum a fost intenționat. Ce s-a făcut pentru a rezolva acest lucru? A fost o problemă de cache? „AddHandler care este generat de cPanel automat” - cPanel nu ar trebui să editeze fișierul `.htaccess` din subdirector? `AddHandler` ar fi de obicei doar în fișierul rădăcină `.htaccess`. (?)
alancc avatar
drapel cn
Cred că asta se datorează cache-ului Cloudflare. Deși întrerup Cloudflare pe site-ul meu când testez, cache-ul sau ceva mai pot deduce. Acum memoria cache a expirat. Da, în mod normal, Addhandler ar trebui să fie pentru root .htaccess.Cu toate acestea, în cazul meu, clientul folosește WHMCS care de obicei nu acceptă cea mai recentă versiune de PHP, așa că trebuie să setez o versiune diferită pe acel subdir. Vă mulțumesc foarte mult că ați subliniat acest lucru.

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.