301 перенаправление перезаписанных страниц

#.htaccess #redirect #mod-rewrite #url-rewriting #http-redirect

#.htaccess #перенаправление #мод-перезапись #url-переписывание #http-перенаправление

Вопрос:

Я перемещаю существующий проект из корневой папки в языковую папку / fr, чтобы создать другой проект на английском языке, расположенный в / en.

Проект прост, он состоит из двух страниц (index.php и liste.php ). Первая страница получала параметр

 /index.php?hash=[page-hash]
  

и был перезаписан в .htaccess как

 /[page-hash].html
  

Итак, вот содержимое старого .htaccess:

 RewriteEngine On
#########   Page rewriting  ########
RewriteRule ^liste.html$           liste.php [QSA,L]
RewriteRule ^(.*).html$            index.php?hash=$1 [QSA,L]
  

Я хочу старые перезаписанные страницы (www.domain.com /[page-hash].html), которые индексируются Google, для 301 перенаправления на www.domain.com/fr /[page-hash].html, чтобы Google по-прежнему находил их в новом месте и сообщал, что оно было перемещено.

Это не перезапись, это перенаправление, и я не знаю, как это сделать. Я предполагаю, что я должен использовать RewriteCond и [R = 301], но я не знаю как.

Конечно, новые страницы также должны быть переписаны (/fr/index.php?hash=[page-hash] в /fr /[page-hash].html), а корень обычно перенаправляется на /fr. Итак, я уже создал этот новый .htaccess:

 RewriteEngine On
######## Redirect from root to /fr #######
RewriteRule ^$                      /fr 
Redirect 301 /liste.html            /fr/liste.html
Redirect 301 /liste.php             /fr/liste.html
#########   Page rewriting  ########
RewriteRule ^fr/liste.html$        /fr/liste.php [QSA,L]
RewriteRule ^fr/(.*).html$         /fr/index.php?hash=$1 [QSA,L]
RewriteRule ^en/list.html$         /en/list.php [QSA,L]
RewriteRule ^en/(.*).html$         /en/index.php?hash=$1 [QSA,L]
  

Комментарии:

1. Я понял это, по крайней мере, часть этого. Я использую [R] для правила перенаправления и применяю его к liste.html RewriteRule ^liste.html$ /fr/liste.html [QSA,R,L] с инструкцией [L], чтобы она игнорировала следующие правила. Только тогда я также использую правило [R] для перенаправления других страниц : RewriteRule ^(.*).html$ /fr/index.php?hash=$1 [QSA,R]

Ответ №1:

Вы довольно близки к этому. Вы можете уплотнить их, и вам нужно только QSA B ), когда ваша замена содержит запрос.

 RewriteEngine On
######## Redirect from root to /fr #######
RewriteRule ^$ /fr/ [L,R=301]
RewriteRule ^([^/] ).(?:html|php)$ /fr/$1.html [L,R=301]
######### Page rewriting ########
RewriteRule ^(fr/liste|en/list).html$ $1.php [L]
RewriteRule ^(fr|en)/([^/] ).html$ $1/index.php?hash=$2 [L,B,QSA]
  

Комментарии:

1. Op хочет перенаправить старые URL-адреса в новый формат, например: /path /?q=foo в /foo QSA здесь не решение.

2. Спасибо, но это не решение. Чтобы выразить это по-другому, я хочу последовательно применить два правила. Сначала эта (перенаправление): RewriteRule ^(.*).html$ /fr/index.php?hash=$1 [R=301] А ЗАТЕМ эта (перезапись): RewriteRule ^fr/(.*).html$ /fr/index.php?hash=$1 [QSA,L] . Постоянная проблема заключается в том, что это правило должно применяться ко всем хэшам, но не к /liste.html ни то, ни другое /liste.php .

3. Первые два правила являются перенаправлениями, вот что R=301 делает. Он перенаправляет со старого симпатичного URL на новый симпатичный URL, как и должно быть. Вы пробовали их?

4. @starkeen у тебя все встало на свои места.

5. @bolino вы ошибаетесь, вы не раскрываете свою внутреннюю структуру URL при внешнем перенаправлении.

Ответ №2:

Вот полный ответ. Порядок важен.

 RewriteEngine On
#########   Page rewriting  ########
RewriteRule ^fr/liste.html$        /fr/liste.php [L]
RewriteRule ^fr/(.*).html$         /fr/index.php?hash=$1 [L,B,QSA]
RewriteRule ^en/list.html$         /en/list.php [L]
RewriteRule ^en/(.*).html$         /en/index.php?hash=$1 [L,B,QSA]
################ Redirect from root to /fr ################
RewriteRule ^$                      /fr [L,R=301]
RewriteRule ^liste.html$           /fr/liste.html [L,R=301]
RewriteRule ^(.*).html$            /fr/$1.html [L,R=301]
  

Это все еще можно сжать (см. Ответ Уолфа).

Комментарии:

1. Как ваше последнее правило не перенаправляет бесконечно? RewriteRule ^(.*).html$ /fr/$1.html [L,R=301] совпадает somehash.html , но также en/somehash.html и en/fr/en/fr/cng/fy3/qo4ncg/6R$$%^/#CNO/.html .

2. Потому что это последнее правило, и потому что у всех правил есть [L] флаги? Я протестировал это, и это работает во всех случаях. Я могу изменить .* на [^/] , хотя, чтобы быть более эксклюзивным.