У меня есть веб-сайт, для которого я хотел бы перенаправить следующие запросы:
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.