RewriteRule дает мне проблемы с моим регулярным выражением - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь сделать простое перенаправление, где переход к URL-адресу, подобному www.example.com/foo, приведет меня к www.example.com/quokka/inquiry/ask.php?user=foo.

В целях тестирования я начал с этого:

RewriteRule ^(m.*)$ /quokka/inquiry/ask.php?user=$1

Это прекрасно работает для случаев, когда foo начинается с буквы: m, но я хочу, чтобы он был супер настраиваемым.Итак, я делаю это перенаправление (обратите внимание на удаление буквы m):

RewriteRule ^(.*)$ /quokka/inquiry/ask.php?user=$1

Почему вышеприведенный RewriteRule не работает ни для одного экземпляра foo?Я полагаю, что с моим Regex что-то не так?

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 29 сентября 2018
RewriteRule ^(.*)$ /quokka/inquiry/ask.php?user=$1

В зависимости от того, какие другие директивы у вас есть в вашем файле .htaccess, это может вызвать внутренний цикл перезаписи, который препятствует правильному разрешению URL-адреса (вы получаете 500Внутренняя ошибка сервера?).Или, в лучшем случае, недопустимая перезапись на /quokka/inquiry/ask.php?user=quokka/inquiry/ask.php.

в сторону: Обратите внимание, что, как уже упоминалось, это внутренняя перезапись , а не строго перенаправление"как вы заявили в своем вопросе.Термин «перенаправление» обычно относится к «внешнему перенаправлению 3xx».(Хотя, по общему признанию, документы Apache также путают эти термины, но, по крайней мере, квалифицируйте это как «внутреннее перенаправление».)

В случае вышеуказанной директивы перезаписанный URL также захватывается ^(.*)$шаблон (который захватывает что угодно ), что приводит к циклу что-то вроде:

  1. Запрос: www.example.com/foo
  2. Переписано на: /quokka/inquiry/ask.php?user=foo
  3. Перезаписано на: /quokka/inquiry/ask.php?user=quokka/inquiry/ask.php
  4. Переписано на: /quokka/inquiry/ask.php?user=quokka/inquiry/ask.php
  5. :

Перезапись URL-адреса не прекращается, когда заканчиваетсяфайл .htaccess.Обработка зацикливается, пока URL не пройдет без изменений.(Хотя то, что считается «изменением», не всегда понятно, поскольку вы можете получить циклы, просто переписав URL, даже если переписанный URL такой же, как на шаге 4 выше.)

шаблон ^(m.*)$ «работает», потому что переписанный URL не начинается с буквы «m».Но если у вас есть другие URL-адреса, начинающиеся с буквы «m», они также будут перезаписаны и станут недоступными.

У вас должен быть уникальный URL-адрес, который захватывает только «идентификаторы пользователей»." (в этом случае).Например, все URL-адреса, которые ссылаются на «идентификаторы пользователей», могут иметь определенный префикс, например.example.com/u/<userid>.

RewriteRule ^u/(.*)$ /quokka/inquiry/ask.php?user=$1

Или, возможно, имеют максимальную длину, которая не конфликтует ни с одним другим URL (например, между 3 и 8 символами):

RewriteRule ^(.{3,8})$ /quokka/inquiry/ask.php?user=$1

Также, есливы ограничиваете формат идентификатора пользователя, тогда этого также может быть достаточно.например.только строчные буквы:

RewriteRule ^([a-z]+)$ /quokka/inquiry/ask.php?user=$1

Однако я бы предпочел использовать префикс и ограничение (регулярное выражение всегда должно быть как ограничение ), так как это позволяет избежать потенциальных конфликтов в будущем.Например:

RewriteRule ^u/([a-z]{3,8})$ /quokka/inquiry/ask.php?user=$1 [L]

Также добавьте флаг L, чтобы гарантировать, что никакие другие директивы, которые следуют сразу же, не будут обработаны.

...