Назад | Перейти на главную страницу

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, затем добавьте вершина / приложение / прямо перед и оставьте все по-прежнему.

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

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

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

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

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.