Переписать после 3 или 4 символов - PullRequest
1 голос
/ 24 июня 2019

Мои URL-адреса выглядят так:

www.example.com/1234-title-of-an-event/whatever/

Мне нужно взять все после "1234-" (но это может быть также трехзначное число, например "123-") и до косой черты«/ что угодно» для перенаправления как:

www.example.com/title-of-an-event/

Я пытаюсь использовать следующее правило (как самое последнее правило), но, похоже, оно не работает, и я получаю только 500 Internal Server Error.

RewriteRule ^\/([0-9]{3,4})-(.*)\/(.*) https://www.example.com/$2 [R=301, L]

1 Ответ

1 голос
/ 24 июня 2019
RewriteRule ^\/([0-9]{3,4})-(.*)\/(.*) https://www.example.com/$2 [R=301, L]

Ошибка 500, скорее всего, вызвана пробелом в аргументе flags. Это должно быть [R=301,L] (без пробела). Однако эта директива ничего не будет делать в .htaccess из-за префикса косой черты в шаблоне RewriteRule . В контексте каталога (т. Е. .htaccess) URL-путь, которому соответствует шаблон RewriteRule , исключает префикс каталога, который заканчивается косой чертой, поэтому URL-путь, который Совпадение никогда не начинается с косой черты. (Вам потребуется сопоставить префикс с косой чертой в контексте сервера / vhost.)

Это также, вероятно, не должно быть "самым последним правилом", если у вас есть другие директивы mod_rewrite - может быть конфликт (не видя весь ваш файл).

Нет необходимости избегать косых черт в шаблоне RewriteRule . Косые черты здесь не имеют особого значения, поскольку пробелы эффективно используются в качестве разделителей регулярных выражений в файлах конфигурации Apache.

Я бы также изменил ваше регулярное выражение, чтобы оно соответствовало всему , за исключением косой черты (т. Е. [^/]+), вместо всего , поскольку ваше регулярное выражение (захватывая подшаблон) будет соответствовать title-of-an-event/whatever в вашем примере URL, а не title-of-an-event, как предполагалось. Поскольку регулярное выражение по умолчанию жадный .

Итак, попробуйте следующее вместо top вашего .htaccess файла:

RewriteRule ^\d{3,4}-([^/]+) /$1 [R=302,L]

Это соответствует /1234-title-of-an-event и отбрасывает все остальное, возвращая title-of-an-event в обратной ссылке $1. (Требуется ли трейлинг /<whatever>/ для успешного совпадения?)

\d - это просто сокращение для [0-9].

Нет необходимости иметь под-шаблоны захвата в регулярном выражении, если обратные ссылки не используются.

Нет необходимости включать абсолютный URL в подстановку , если у вас нет нескольких доменов или вы канонизируете схему / имя хоста в перенаправленном ответе.

Обратите внимание, что это 302 (временное) перенаправление - измените только на 301 (постоянное) перенаправление - если это является намерением - как только вы подтвердите, что это работает нормально, чтобы избежать проблем с кэшированием. Перед проверкой вам нужно будет очистить кеш браузера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...