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.