htaccess Как RewriteRule со специальными символами?

У меня есть веб-сайт, для которого я хотел бы перенаправить следующие запросы:

www.example.com/wwv_flow.js_messages?p_app_id=103&p_lang=fr&p_version=19.1.0.00.15-51560988

Кому:

www.example.com/apex/app/wwv_flow.js_messages?p_app_id=103&p_lang=fr&p_version=19.1.0.00.15-51560988

По сути, правило: всякий раз, когда запросы начинаются с wwv , затем добавляется вершина / app / прямо перед и оставьте все по-прежнему.

В моем файле .htaccess я пробовал:

RewriteCond %{HOST_NAME} ^wwv([.]+)/?$
RewriteRule ^wwv([.]+)/?$ ./apex/app/$1 [L]

Но он не работает. Во-первых, условие не работает, а во-вторых, перенаправление не работает из-за специальных символов в URL-адресе: ?, &, =

Кто-нибудь знает, как решить эту проблему?

1
задан 30 September 2019 в 11:39
1 ответ
 RewriteCond% {HOST_NAME} ^ wwv ([.] +) /? $
RewriteRule ^ wwv ([.] +) /? $ ./Apex/app/$1 [L]
 

Этот блок правил никогда не будет соответствовать указанному URL-адресу по нескольким причинам:

  • Регулярное выражение [.] (точка внутри класса символов) соответствует буквальной точке, а не « любой символ ». Класс символов отрицает особое значение точек. Итак, [.] + соответствует 1 или более точкам. Вам следует снять квадратные скобки, т.е. . + для соответствия 1 или более «любому символу». Хотя для соответствия любому запросу, который просто «начинается с wwv » (как указано в вашем вопросе), все регулярное выражение можно упростить до ^ wwv (. *) .
  • В директива RewriteCond похоже, что вы пытаетесь сопоставить часть wwv с именем хоста . В вашем примере URL wwv является частью URL-пути, а не имя хоста .
  • Нет такой переменной HOST_NAME . Возможно, вы имели в виду HTTP_HOST ? Однако это все еще неверно (как упоминалось выше). (Вы должны были использовать REQUEST_URI - для сопоставления с URl-путем - но тогда регулярное выражение все равно было бы неправильным. Однако это условие в любом случае излишне.)

RewriteCond (условие) здесь не требуется. (Повторение того же сравнения в RewriteCond , которое вы выполняете в директиве RewriteRule , излишне и просто приводит к дополнительной «работе».)

Префикс ./ в подстановке RewriteRule здесь не требуется и должен быть удален.

Обратите внимание, что шаблон RewriteRule соответствует только URL-пути. Это, в частности, исключает строку запроса. (Если вам специально нужно сопоставить строку запроса, вам понадобится директива RewriteCond , которая сопоставлена ​​с серверной переменной QUERY_STRING . Но здесь это не требуется.)

Сначала условие не работает, а во-вторых, перенаправление не выполняется из-за специальных символов в URL: ? , & , =

На самом деле это не так " специальные символы ", и они не должны вызывать здесь проблемы. Он терпит неудачу, потому что он просто ничего не делает (как указано выше) - он не соответствует запрошенному URL.

Строка запроса передается в замену по умолчанию, поэтому вам ничего не нужно делать с «специальными символами».

Решение

всякий раз, когда запросы начинаются с wwv , затем добавьте apex / app / справа перед и оставьте все то же.

Для выполнения необходимого «перенаправления» вам потребуется что-то вроде следующего:

RewriteRule ^wwv(.*) /apex/app/$1 [R=302,L]

(. *) подшаблон захвата соответствует оставшейся части URL-пути, т.е. _flow.js_messages в вашем примере. И это затем упоминается в подстановке с обратной ссылкой $ 1 .

Как отмечалось выше, строка запроса (например, p_app_id = 103 & p_lang = fr & p_version = 19.1.0.00 .15-51560988 ) по умолчанию передается в подстановку . Здесь ничего лишнего делать не нужно.

Обратите внимание, что это 302 (временное) перенаправление.

Если вам требуется внутренняя перезапись (как предлагается в фрагменте кода), удалите Флаг R . И при желании удалите префикс косой черты в подстановке RewriteRule (но это может зависеть от значения RewriteBase - если оно есть).

RewriteRule ^wwv(.*) apex/app/$1 [L]

Обратите внимание, что порядок этих директив в .htaccess важен. Если у вас есть существующие директивы mod_rewrite, то это, вероятно, должно быть в самом верху.

На самом деле вам не нужен mod_rewrite, если это единственное действие, которое вы выполняете. Mod_alias RedirectMatch будет достаточно. Однако mod_rewrite, вероятно, потребуется, если у вас есть существующие директивы mod_rewrite.

0
ответ дан 4 December 2019 в 02:41

Теги

Похожие вопросы