it-swarm.xyz

Изменение структуры постоянной ссылки - перенаправление в htaccess разрывает ссылки на архив

Когда я начал с моего блога, постоянные ссылки и следующая структура:

http://<domain>/%year%/%monthnum%/%day%/%postname%/

Некоторое время назад я изменил структуру постоянных ссылок только на "http://<domain>/%postname%/".

Чтобы заняться внешними ссылками на старую структуру постоянных ссылок, я добавил следующую строку в мой htaccess-файл:

RedirectMatch 301 /([0-9]+)/([0-9]+)/([0-9]+)/(.*)$ http://<domain>/$4

Теперь проблема в том, что строка перенаправления разрывает ссылки на архивы, например. "http://<domain>/2010/09/02" перенаправляется на главную страницу, а не показывает сообщения от 2 сентября 2010 года.

Можно ли исправить директиву перенаправления в htaccess, или я не смогу съесть торт и иметь его тоже?

2
TFM

RedirectMatch для Mod_Alias ​​не так мощен, как Mod_Rewrite. Если у вас есть Mod_Rewrite на вашем хосте (например, его используют Pretty Permalinks), вы можете выполнить перенаправление только в том случае, если URL не в формате ссылки на архив.

Для проверки в этом случае есть RewriteCond и для создания команды перенаправления есть RewriteRule ... [R=301] директива.

Пример на основе ваших данных:

RewriteCond %{REQUEST_URI} !^/((20|19)[0-9]{2})/([0-9]{2})/[0-9]{2}$ [NC]
RewriteRule ^/([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*)$ http://<domain>/$4 [R=301,L]

Это не проверено, но я думаю, что это должно сделать работу. Я использовал квантификатор ({2}), чтобы лучше указать, сколько чисел вы ожидаете. Рядом с этим в RewriteCond я создал шаблон, который соответствует только 20 .. и 19 .. годам.

Первая строка (условие, RewriteCond) проверяет, не совпадает ли URL-адрес архива, и только если не совпадает, будет выполнено правило для перенаправления. RewriteRule в основном делает то же самое, что и ваша директива RedirectMatch.

2
hakre