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

Перенаправление Apache на основе совпадения каталога и добавление еще одной буквы в целевой URL

Итак, вот чего я пытаюсь достичь. У меня есть эта ссылка, я хочу перенаправить 301:

Исходный URL:

https://www.example.com/folder1/page.aspx?fh_location=%2f%2fpackages%2fnl_BE%2fpr_earlybookable%3E%7b0%7d%2fpk_active%3d1%2fpk_siteswitch%3E%7bnvb%7d%2fpk_country%3E%7biso_pt%7d%2fpk_city%3E%7bgeo_9833%7d%2fpr_duration%3E%7b0608%7d%2fpk_hotelonly%3d0&fh_sort_by=pr_defaultprice&fh_secondid = nbs_city_cli16a_s18&fh_view=detail&fh_eds=%C3%9F&RoomOccupation1=CLI16A_2a_LO_2_0

Условие 1: У меня есть список каталогов, например folder1, folder2, folder3, folder4. Я хочу перенаправить, только если URL-адрес содержит любую из перечисленных выше папок, но не для folder5 или любые другие папки, не указанные выше в URL-адресе.

Условие 2: Теперь наступает сложная часть; в пункте назначения он должен принимать идентификатор cli16a из URL fh_secondid=nbs_city_cli16a_s18 а затем добавьте к целевому URL, как показано ниже

Условие 3: Теперь самое сложное. Добавьте это Y к целевому URL-адресу, который представляет папку в исходном URL-адресе, например, folder1 знак равно Y, folder2 знак равно O, folder3 знак равно B, folder4 знак равно C.

Пока что я придумал следующее.

RewriteMap WE NEED TO GET A MAPPING OF TYPE OF HOTEL (not sure what to put here)
RewriteCond %{REQUEST_URI}  ==(folder1|folder2|folder3|folder4) [NC]
RewriteCond ${conv-lc:%{QUERY_STRING}} (fh_secondid)=[^_]+_[^_]+_([^_]+)_
RewriteRule ^/nl/_USE RewriteMap Matching text here/ ( not sure what to put here)

Судя по его звукам, вам не обязательно необходимость а RewriteMap, при условии, что количество каталогов ограничено, как они выглядят, а идентификатор не чувствителен к регистру в целевом URL, что, по вашему мнению, нет (в комментариях).

Для удостоверения личности суффикс («Y», «O», «B» или «C») мы можем создать переменную среды в зависимости от запрашиваемого каталога:

RewriteEngine On

# Assign value to ID_SUFFIX based on the directory being accessed
RewriteRule ^/?folder1 - [E=ID_SUFFIX:Y]
RewriteRule ^/?folder2 - [E=ID_SUFFIX:O]
RewriteRule ^/?folder3 - [E=ID_SUFFIX:B]
RewriteRule ^/?folder4 - [E=ID_SUFFIX:C]

Затем обрабатывайте запрос, только если ID_SUFFIX env var был установлен, требуемый идентификатор был взят из строки запроса:

# Capture ID and redirect
RewriteCond %{ENV:ID_SUFFIX} .
REwriteCond %{QUERY_STRING} fh_secondid=[^_]+_[^_]+_([^_]+)
RewriteRule ^ /be/_%1%{ENV:ID_SUFFIX}/ [R=302,L]

Выражение %{ENV:ID_SUFFIX} естественно, относится к ранее установленной переменной env (если вообще). Первоначально мы просто проверяем, что он установлен (т. Е. Содержит что-то) - устанавливается, только если был запрошен один из названных каталогов.

%1 это обратная ссылка на первую захваченную группу в последнем совпавшем CondPattern. т.е. Это содержит идентификатор (например, cli16a в вашем примере).

Затем это создает замена формы /be/_cli16aY/ и выдает внешнее перенаправление.

Обратите внимание, что в настоящее время это 302-е (временное) перенаправление. Меняйте его на 301 (постоянный), только если вы уверены, что он работает нормально, чтобы избежать проблем с потенциальным кешированием.