Redirecționează toate paginile cu excepția uneia către pagina principală prin .htaccess
Tocmai am transformat un site vechi într-un site WordPress cu o singură pagină.
Site-ul vechi avea mai multe URL-uri, acum există doar unul: pagina principală. Plus încă o pagină cu politica de confidențialitate.
Prin urmare, aș dori să redirectez toate URL-urile cu excepția celui cu slug-ul "privacy" către pagina principală.
Iată ce încerc, fără succes:
#redirectări personalizate
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
</IfModule>
# BEGIN WordPress (reguli htaccess standard wp)
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Primesc prea multe redirecționări: toate URL-urile se redirecționează la infinit către ele însele, de ce?
ar fi mai bine (dacă e posibil) să folosesc o regulă de redirecționare în loc de o rescriere?
ACTUALIZARE
urmând sugestiile din comentarii, am încercat următoarele redirecționări personalizate (înainte de regulile standard WP):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/privacy-policy$
RewriteRule (.*) http://mywebsite.com/ [R=301,L]
</IfModule>
Dar tot nu funcționează
Probleme
Am prea multe redirecționări: toate URL-urile se redirecționează la infinit către ele însele, de ce?
Regulile de rescriere Apache sunt procesate de sus în jos, astfel încât regula ta personalizată de rescriere este întotdeauna procesată prima. Flag-ul R
de redirecționare instruiește Apache să-i spună browserului să facă o nouă cerere către URL-ul modificat în loc să servească destinația rescrierii la adresa curentă, iar flag-ul L
"last" îi spune lui Apache să ignore toate regulile de rescriere ulterioare - așa că de fiecare dată când regula ta RewriteRule
este aplicată, se face o nouă cerere și regulile tale sunt procesate din nou de la început.
Condiția ta RewriteCond
instruiește Apache să proceseze regula RewriteRule
următoare ori de câte ori calea URI-ului cererii nu începe cu /privacy-policy
- astfel, practic fiecare cerere duce la o redirecționare înainte ca oricare dintre celelalte reguli din fișierul tău .htaccess
să poată fi măcar evaluate.
Așa cum @MarkKaplun a sugerat în comentarii, $1
este o referință inversă care este înlocuită cu porțiunea din URI-ul potrivit conținută în primul "grup de captură" (primul set de paranteze din model). Deoarece .*
se potrivește literalmente cu orice număr de orice caractere, în regula ta RewriteRule
, $1
este înlocuit cu întregul cale URI.
În esență, regulile tale de rescriere:
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
se evaluează la "Dacă URI-ul nu începe cu /privacy-policy/
, instruiește browserul să trimită o nouă cerere către http://www.mywebsite.com/(calea URI originală)
".
Deci, pentru ilustrare, să presupunem că ai navigat către http://www.mywebsite.com/blog/2015
; iată ce se întâmplă cu fiecare cerere:
/blog/2015
nu începe cu/privacy-policy/
, spune browserului să meargă lahttp://www.mywebsite.com/blog/2015
./blog/2015
nu începe cu/privacy-policy/
, spune browserului să meargă lahttp://www.mywebsite.com/blog/2015
./blog/2015
nu începe cu/privacy-policy/
, spune browserului să meargă lahttp://www.mywebsite.com/blog/2015
.- [...]
Eliminarea referinței inverse $1
din RewriteRule
este insuficientă, deoarece o cale URI de /
(sau pur și simplu una goală) încă nu se califică ca începând cu /privacy-policy/
, rezultând în comportamentul:
/blog/2015
nu începe cu/privacy-policy/
, spune browserului să meargă lahttp://www.mywebsite.com/
./
nu începe cu/privacy-policy/
, spune browserului să meargă lahttp://www.mywebsite.com/
./
nu începe cu/privacy-policy/
, spune browserului să meargă lahttp://www.mywebsite.com/
.- [...]
Poți verifica acest comportament uitându-te la fișierele jurnal ale instalării tale Apache.
Soluție
Dacă nu intenționezi să folosești rutarea de adrese intenționată de WordPress, nu există niciun motiv să păstrezi regulile implicite de rescriere și să adaugi altele deasupra lor. Personalizează-le în funcție de nevoile tale în loc să adaugi complexitate:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(/|index\.php)$ /index.php? [L]
RewriteRule ^/?privacy-policy/?$ /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /? [L,R=301]
</IfModule>
Pe scurt,
- .
RewriteRule ^(/|index\.php)$ /index.php? [L]
Dacă s-a solicitat explicit
/
sauindex.php
, serveșteindex.php
, dar elimină șirul de interogare (pentru a preveni schimbarea paginilor prin manipularea variabilelor de interogare) și oprește procesarea rescrierilor. - .
RewriteRule ^/?privacy-policy/?$ /index.php [L]
Dacă s-a solicitat explicit
privacy-policy
(cu sau fără slash-uri la început sau sfârșit), serveșteindex.php
și oprește procesarea rescrierilor. - .
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /? [L,R=301]
Dacă numele fișierului solicitat nu este un fișier și nu este un director, potrivește un singur caracter oriunde (pentru a aplica regula indiferent de URI) și instruiește browserul să facă o nouă cerere către
/
și să renunțe la șirul său de interogare. Oprește procesarea rescrierilor.
Este important de menționat că rezultatul dorit de tine va produce probabil multe comportamente neașteptate - probabil nu vei putea accesa panoul de administrare, de exemplu. Fișierele atașate ar putea, de asemenea, să nu funcționeze. Dar cele de mai sus ar trebui să ofere cel puțin un punct de plecare bun pentru a învăța mai multe despre directivele de rescriere.

mulțumesc @florian, dar încă nu funcționează, continuă să redirecționeze către exact aceeași pagină pe care încerc să o accesez. Indiferent de URL, se redirecționează la sine la infinit. PS: de ce extensia ".html"?

Îmi pare rău, extensia '.html' este într-adevăr învechită. Sună ciudat că tot ești redirecționat la infinit. Majoritatea browserelor stochează redirecționările 301 în cache. Aș recomanda să folosești Firebug pentru Firefox. Dacă utilizezi FireBug, în fila Network din meniul derulant există o opțiune pentru a dezactiva cache-ul browserului.
