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