#.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]
флаги? Я протестировал это, и это работает во всех случаях. Я могу изменить.*
на[^/]
, хотя, чтобы быть более эксклюзивным.