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 или может быть больше знаков «плюс». Предпочтительно вариант с регулярным выражением будет хорош, потому что текст все+буквы+с+плюсом может включать что угодно, от цифр до алфавитов, но не знаки.

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

Любая помощь приветствуется.


person JavaBugger    schedule 11.11.2011    source источник


Ответы (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]

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

person Jon Lin    schedule 11.11.2011
comment
Привет, Джон. Кажется, это не работает. Он только удалил знак + плюс из двух последних букв. Я хочу, чтобы это работало рекурсивно, удаляя все знаки плюса. example.com/try/this/all+letters+with+plus -› example.com/try/this/all+letters+withplus Вы были правы, я просто хочу, чтобы он был переписан внутри, а не перенаправлялся на другой URL. Любые предложения. Спасибо. Я нахожу некоторое руководство в этом направлении с вашими предложениями. - person JavaBugger; 14.11.2011
comment
Если вам не нужна переадресация, то просто используйте верхнее правило. Когда я ввожу RewriteRule ^try/this/(.*)\+(.*)$ /try/this/$1$2 [PT] в свой файл .htaccess и проверяю его с помощью example.com/try/this/a+b+c+d+++++e++++f++++++g+h+++++, я смотрите запрос например.com/try/this/abcdefgh в логах. - person Jon Lin; 14.11.2011