RedirectMatch - остановить его от совпадения с первым появлением - PullRequest
0 голосов
/ 08 октября 2018

Мои перенаправления сопоставляются по первому вхождению, а не по ближайшему совпадению.

URL запроса: /audios/3933

RedirectMatch 301 ^/audios/393/ /artists/a/1849
RedirectMatch 301 ^/audios/3933/ /artists/b/1850

Он просто соответствует первому правилу и имеет смысл из-за ^.Однако как я могу получить его, чтобы он соответствовал полному идентификатору в URL.

Обратите внимание, что после цифр есть какая-то строка, о которой я не знаю.Например, URL может быть /audios/393/a или /audios/3933/a.

Как я могу заставить это работать?Я использую Apache 2.4 на Ubuntu.

1 Ответ

0 голосов
/ 08 октября 2018

Правила перенаправления (и перезаписи) должны указываться с наиболее ограничивающим соответствием, а затем с более разрешающим (сверху вниз в файле конфигурации).

В вашем конкретном случае вы упоминаете, что есть некоторыестрока после цифр.Поэтому вы можете изменить свою конфигурацию следующим образом:

RedirectMatch 301 "^/audios/393/.*$"  "/artists/a/1849"
RedirectMatch 301 "^/audios/3933/.*$" "/artists/b/1850"

Если вам нужна строка, которая следует за цифрами, используйте эту конфигурацию:

RedirectMatch 301 "^/audios/393/(.*)$"  "/artists/a/1849/$1"
RedirectMatch 301 "^/audios/3933/(.*)$" "/artists/b/1850/$1"

Где $1 будет заменено настрока, ограниченная круглыми скобками..* означает «любой символ (.), повторяется от 0 до n раз (*).

Для строки запроса RedirectMatch является частным случаем директивы Redirect. В документации Redirect (https://httpd.apache.org/docs/2.4/mod/mod_alias.html#redirect), вы можете прочитать:

Это включает в себя запросы с параметрами GET, например http://example.com/service/foo.pl?q=23&a=42,, оно будет перенаправлено на http://foo2.example.com/service/foo.pl?q=23&a=42. Обратите внимание, что сообщения POST будут отброшены.

Таким образом, строка запроса добавляется автоматически (GET).

Если вы этого не хотите, вы можете использовать RewriteRule вместо этого с флагом [QSD], поскольку целевой URL не содержит строку запроса. Этот флаг не добавит строку запроса к целевому URL.

Конфигурация будет выглядеть следующим образом:

RewriteEngine On
RewriteRule "^/audios/393/.*$"  "/artists/a/1849" [R=301,L,QSD]
RewriteRule "^/audios/3933/.*$" "/artists/b/1850" [R=301,L,QSD]

Использование скобок и $1 работает так же с RewriteRule, если вам это нужно.

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