这就是我想要实现的目标。我有这个链接,我想进行 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 中上面未列出的任何其他文件夹。folder2
folder3
folder4
folder5
条件2:现在到了棘手的部分;在目标中,它应该cli16a
从 URL 中获取 id 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)
答案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(永久),以避免潜在的缓存问题。