Redirecționează toate paginile cu excepția uneia către pagina principală prin .htaccess

28 apr. 2016, 18:10:13
Vizualizări: 31.3K
Voturi: 1

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ă

4
Comentarii

probabil asta face $1 ;)

Mark Kaplun Mark Kaplun
28 apr. 2016 18:15:00

RewriteCond %{REQUEST_URI} !^/privacy-policy$ încearcă asta

Owais Alam Owais Alam
28 apr. 2016 18:30:12

am încercat să elimin $1 cum a sugerat @MarkKaplun, același rezultat

bluantinoo bluantinoo
28 apr. 2016 18:47:07

@OwaisAlam Am încercat și sugestia ta, tot nu funcționează

bluantinoo bluantinoo
28 apr. 2016 18:47:25
Toate răspunsurile la întrebare 2
0

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:

  1. /blog/2015 nu începe cu /privacy-policy/, spune browserului să meargă la http://www.mywebsite.com/blog/2015.
  2. /blog/2015 nu începe cu /privacy-policy/, spune browserului să meargă la http://www.mywebsite.com/blog/2015.
  3. /blog/2015 nu începe cu /privacy-policy/, spune browserului să meargă la http://www.mywebsite.com/blog/2015.
  4. [...]

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:

  1. /blog/2015 nu începe cu /privacy-policy/, spune browserului să meargă la http://www.mywebsite.com/.
  2. / nu începe cu /privacy-policy/, spune browserului să meargă la http://www.mywebsite.com/.
  3. / nu începe cu /privacy-policy/, spune browserului să meargă la http://www.mywebsite.com/.
  4. [...]

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,

  1. .

    RewriteRule ^(/|index\.php)$ /index.php? [L]

    Dacă s-a solicitat explicit / sau index.php, servește index.php, dar elimină șirul de interogare (pentru a preveni schimbarea paginilor prin manipularea variabilelor de interogare) și oprește procesarea rescrierilor.

  2. .

    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ște index.php și oprește procesarea rescrierilor.

  3. .
    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.

29 apr. 2016 08:32:57
2

Vă rugăm să încercați

<IfModule mod_rewrite.c>
RewriteRule ^/politica-de-confidentialitate/? politica-de-confidentialitate [L,NC]

RewriteCond %{HTTP_HOST} ^(www\.)?sitevechi\.com  [NC]
RewriteRule ^ http://siteulmeu.com%{REQUEST_URI} [NE,R=301,L]
</IfModule>
28 apr. 2016 19:05:30
Comentarii

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"?

bluantinoo bluantinoo
28 apr. 2016 20:26:26

Î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.

Florian Florian
29 apr. 2016 11:44:07