301 динамическое перенаправление URL-адресов на новые динамические URL-адреса

Во-первых, я пытаюсь найти решение уже в темах, но не нашел ничего близкого к моей проблеме, поэтому решаю спросить здесь. Я новичок, когда дело касается htacces и динамических перенаправлений, поэтому я надеюсь, что узнаю об этом больше с вашей помощью.

Мне нужно перенаправить мои старые динамические URL-адреса в новый формат URL-адресов с перенаправлением 301 в htaccess.

У меня есть БД со списком городов в формате:

http://www.exampledomain.com/city/1_NewYork/

Я хочу изменить свои URL-адреса на новый формат, как в примере ниже:

http://www.exampledomain.com/1_NewYork/

У меня в базе данных более 300 городов, и я хочу автоматически перенаправить старые URL-адреса в новый формат с перенаправлением 301, поэтому мне не нужно вводить ручное перенаправление 301 в htaccess для каждого города.

Текущий Htaccess:

RewriteEngine On

RewriteRule ^ city / ([-]? [0-9] +) ([-_] [^ /] *)? index.php? view = main & cityid = $ 1 [QSA]


Извините за английский, но знаю, что он не самый лучший :)

Заранее спасибо.


person break    schedule 16.12.2014    source источник
comment
Вы пробовали удалить city/ часть RewriteRule?   -  person Brewal    schedule 16.12.2014
comment
Возможно, я не объяснил точно, это не проблема, чтобы изменить формат URL-адреса на то, что я хочу, и заставить его работать. Проблема в том, что когда я это делаю, старые URL-адреса будут указывать на страницу с ошибкой 404, и я хочу перенаправить пользователей на новую страницу с правильным URL-адресом с 301, чтобы у меня не возникало проблем с Google и не терялись проиндексированные страницы.   -  person break    schedule 16.12.2014


Ответы (3)


Вы можете использовать это правило как самое первое правило перед другими правилами:

RewriteEngine On

RewriteRule ^city/([^/]+)/?$ /$1 [L,NC,R=302]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-]+)/?$ index.php?view=main&cityid=$1 [L,QSA]
person anubhava    schedule 16.12.2014
comment
Разве для этого не требуется изменить существующее RewriteRule, удалив city/? - person Brewal; 16.12.2014
comment
Этот тоже работает :) Но почему это [L, NC, R = 302]? Могу ли я поставить 301 вместо кода 302? - person break; 16.12.2014
comment
Да обязательно ставь 301 после твоего тестирования. Также никогда не стоит смешивать RewriteRule с директивой RedirectMatch. Это основная причина, по которой я не предложил вам правило, основанное на RedirectMatch. - person anubhava; 16.12.2014
comment
Так этот подход более дружелюбен и лучше практикуется? Рад узнать. Спасибо за ваш ответ. - person break; 16.12.2014
comment
@JeremiahWinsley: Причина, по которой это не лучшая идея, потому что они обрабатываются в двух разных модулях Apache mod_alias и mod_rewrite. И они вызываются на разных этапах. Таким образом, если у вас есть несколько правил, смешанных с этими двумя директивами, то установить последовательность выполнения правил непросто. - person anubhava; 16.12.2014
comment
@JeremiahWinsley: Я, наверное, прочитал почти все руководства Apache по перезаписи, поэтому читал и это. Если вы будете читать между строк, вы поймете истинное намерение этой статьи. кстати, ни одна из других директив не выполняет тихую (внутреннюю) перезапись, как последнее правило в моем ответе выше. - person anubhava; 16.12.2014

Вы можете использовать RedirectMatch для этого.

RedirectMatch 301 /city/(.*) /$1

и замените правило перезаписи на

RewriteRule ^([-]?[0-9]+)([-_][^/]*)? index.php?view=main&cityid=$1 [QSA]

См. http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirectmatch

person Jeremiah Winsley    schedule 16.12.2014
comment
Фантастика! Это именно то, что мне нужно :) Спасибо. - person break; 16.12.2014

Вы можете попробовать это для перенаправления:

Редирект 301 / город / 1_NewYork / / 1_NewYork /

person Cms Coders    schedule 16.12.2014
comment
Автор попросил сделать все 300 одной командой. - person Steve Kinzey; 08.06.2021