Я пытаюсь перенаправить (или «переписать») более 3000 URL-адресов для сайта, на котором мы обновили SEF большинства страниц с контентом, чтобы удалить идентификационный номер, который не нужен / не нужен. Это должен быть простой процесс с использованием регулярного выражения; однако я узнаю, что регулярное выражение и htaccess - это больше «искусство», чем наука :-(
Вот правило, которое у меня есть:
RewriteRule ^topics\/([-0-9a-zA-Z]+)?\/([0-9]+)(-)([0-9a-z,-]+)? http://example.net/topics/$1/$4 [L,R=301]
Большинство URL-адресов выглядят так:
http://example.net/topics/management/6309-investing-proceeds-from-sale-of-a-farm-or-ranch
и отлично работают с регулярным выражением; однако, если статья начинается с числа и имеет такой URL-адрес:
http://example.net/topics/management/3542-9-new-years-resolutions-for-cattle-producers
Затем регулярное выражение (см. Выше) захватывает не только первый набор из 4 цифр идентификатора, но и первое число (в данном случае «9»), которое должно быть оставлено, что приводит к следующему:
http://example.net/topics/management/new-years-resolutions-for-cattle-producers
Что явно не работает.
Кроме того, в качестве обходного пути я попытался создать несколько настраиваемых правил для обработки нескольких страниц / URL-адресов, имеющих этот формат (с числом в начале заголовка статьи), с правилом перед правилом регулярного выражения, например этот:
Redirect 301 /topics/management/3542-9-new-years-resolutions-for-cattle-producers http://example.net/topics/management/9-new-years-resolutions-for-cattle-producers
или
RewriteRule ^topics\/([-0-9a-zA-Z]+)?\/([0-9]{1,4}?)(-)([0-9,a-z,-]+)? http://example.net/topics/$1/$4 [L,R=301]
Однако, когда я это делаю, правило регулярного выражения (далее в файле htaccess) все еще выполняется, в результате чего цифра «9» удаляется.
Я тестировал это на многих различных сайтах тестирования регулярных выражений и htaccess, и все они работают; тем не менее, на рабочем сервере он продолжает давать сбой.
Веб-сервер: Apache / 2.2.25 (Unix) mod_hive / 4.0 mod_ssl / 2.2.25 OpenSSL / 1.0.0-fips mod_bwlimited / 1.4 mod_fcgid / 2.3.6
И я уже связался со своей серверной / хостинговой компанией, и они сказали, что у них нет опыта, чтобы решить эту проблему.
Кто-нибудь может увидеть, в чем проблема? Я просмотрел сотни сообщений на форуме здесь и в других местах, но ни у кого не было такой проблемы.
Я только что опробовал вашу настройку с небольшим изменением вашей конфигурации. Я настраиваю его в файле конфигурации вместо .htaccess, используя это (обратите внимание, что он ищет начало с / themes-вместо themes-):
RewriteRule ^/topics\/([-0-9a-zA-Z]+)?\/([0-9]+)(-)([0-9a-z,-]+)? http://example.net/topics/$1/$4 [L,R=301]
Тогда тест работает как положено:
[root@proxy conf]# curl -i http://localhost/topics/management/3542-9-new-years-resolutions-for-cattle-producers
HTTP/1.1 301 Moved Permanently
Date: Wed, 15 Apr 2015 14:48:09 GMT
Server: Apache
Location: http://example.net/topics/management/9-new-years-resolutions-for-cattle-producers
Content-Length: 289
Content-Type: text/html; charset=iso-8859-1
РЕДАКТИРОВАТЬ1:
Примерьте вот это:
RewriteRule ^topics\/([-0-9a-zA-Z]+)?\/(\d+)(-)([0-9a-z,-]+)? http://example.net/topics/$1/$4 [L,R=301]
Вместо использования ([0-9]+)
для чисел перед первым тире он заменяется на (\d+)
, на моей настройке все еще работает, возможно, в вашей (\d+)
делает вашу компиляцию Apache более удобной.