Apache 根据目录匹配进行重定向并向目标 URL 添加另一个字母

Apache 根据目录匹配进行重定向并向目标 URL 添加另一个字母

这就是我想要实现的目标。我有这个链接,我想进行 301 重定向:

原产地网址:

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。我只希望在 URL 包含上面列出的任何文件夹时重定向,而不包含URL 中上面未列出的任何其他文件夹。folder2folder3folder4folder5

条件2:现在到了棘手的部分;在目标中,它应该cli16a从 URL 中获取 id fh_secondid=nbs_city_cli16a_s18,然后将其附加到目标 URL,如下所示

条件3:现在是最棘手的部分。将其添加Y到目标 URL,它代表原始 URL 中的文件夹,例如folder1= Yfolder2= Ofolder3= Bfolder4= 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)

答案1

听起来,你不一定需要a RewriteMap,提供的目录数量是有限的,它们看起来是这样的,并且目标 URL 中的 ID 不区分大小写,而您说不是(在评论中)。

对于身份证后缀(“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,从查询字符串中捕获所需的 ID:

# 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}自然是指先前设置的环境变量(如果有的话)。最初,我们只是检查它是否已设置(即包含某物) - 仅当请求了其中一个命名目录时才会设置。

%1是对最后一个匹配的第一个捕获组的反向引用条件模式即,它保存了 ID(例如cli16a在您的示例中)。

然后构造一个代换形式/be/_cli16aY/并发出外部重定向。

请注意,目前这是 302(临时)重定向。只有当您确定它正常工作时才将其更改为 301(永久),以避免潜在的缓存问题。

相关内容