Запрос правил перезаписи Apache, имеющий регулярное выражение и выполняемый рекурсивно

#regex #apache #mod-rewrite #recursion #httpserver

#регулярное выражение #апач #мод-перезапись #рекурсия #сервер http #apache

Вопрос:

Я новичок в правилах перезаписи apache. Я пытаюсь переписать URL

Например :

http://www.example.com/try/this/all letters with plus -> http://www.example.com/try/this/allletterswithplus

итак, требование заключается в том, что я должен перенаправить его на URL, имеющий /try / this и остальные, исключая знак . Следует отметить, что количество знаков плюс не является фиксированным, оно может содержать от 2 до 7 или может быть больше знаков плюс. Предпочтительно, вариант с регулярным выражением будет хорош, потому что текст all letters with plus может содержать что угодно, от числа до алфавита, но без знаков

Я попробовал какую-то комбинацию, но затем она перешла в рекурсивный цикл.

Любая помощь была бы высоко оценена.

Ответ №1:

Вы можете сделать это в 2 шага, используя mod_rewrite. Первый шаг — удалить все » » из всего последующего /try/this/ , затем второй шаг — проверить, был ли в запросе изначально » «, но в текущем URI его нет.

Это правило будет продолжать удалять знаки » » до тех пор, пока их не останется. Но мы просто передаем это через механизм перезаписи.

 RewriteRule ^try/this/(.*) (.*)$ /try/this/$1$2 [PT]
  

Это правило проверяет, был ли в исходном запросе URL-адрес с » «, и если это так, проверьте, все ли они были удалены. Если это так, завершите все перезаписи и перенаправьте браузер:

 RewriteCond %{THE_REQUEST}  /try/this/.* .* HTTP
RewriteRule ^try/this/([^ ]*)$ /try/this/$1 [R,L]
  

Вы упомянули, что хотели перенаправить на /try /this/ URL без знаков » «. Но если вы просто хотите переписать его внутренне, а не перенаправлять браузер, вам не нужна 2-я часть, просто первое правило удалит их.

Комментарии:

1. Привет, Джон, похоже, это не работает. Он только удалил знак » плюс» из последних двух букв. Я хочу, чтобы это работало рекурсивно, удаляя все знаки плюс. example.com/try/this/all letters with plus -> example.com/try/this/all letters withplus Вы были правы, я просто хочу, чтобы это было переписано внутренне, не перенаправляя это на другой URL. Любые предложения. Спасибо. Я нахожу некоторые зацепки в этом направлении с вашими предложениями.

2. Если вам не нужен редирект, то просто используйте главное правило. Когда я ввожу RewriteRule ^try/this/(.*) (.*)$ /try/this/$1$2 [PT] в свой файл .htaccess и тестирую с «example.com/try/this/a b c d e f g h «, я вижу запрос на «example.com/try/this/abcdefgh «в журналах.