Mod-Rewrite

基於目錄匹配的 Apache 重定向 & 向目標 URL 添加另一個字母

  • August 14, 2018

所以這就是我想要完成的。我有這個連結,我想 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, folder2, folder3, folder4。我只想在 URL 包含上面列出的任何文件夾時重定向,但不包含 URL 中folder5未在上面列出的任何其他文件夾。

**條件2:**現在是棘手的部分;在目標中,它應該cli16a從 URL中獲取 id fh_secondid=nbs_city_cli16a_s18,然後附加到目標 URL,如下所示

  • <https://www.example.com/be/_CLI16A>**Y**/

**條件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)

聽起來,您不一定需要a RewriteMap,只要目錄的數量是有限的,它們似乎是,並且目標 URL 中的 ID 不區分大小寫,您說不是(在評論中) .

對於 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設置了 env var 的情況下進一步處理請求,從查詢字元串中擷取所需的 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}自然是指較早設置的 env var(如果有的話)。最初,我們只是檢查它是否已設置(即包含某些內容)-僅當已請求命名目錄之一時才設置它。

%1是對最後匹配的CondPattern中第一個擷取的組的反向引用。IE。這包含 ID(例如cli16a在您的範例中)。

然後,這會構造表單的替換/be/_cli16aY/並發出外部重定向。

請注意,這目前是 302(臨時)重定向。僅當您確定它工作正常時才將其更改為 301(永久),以避免潛在的記憶體問題。

引用自:https://serverfault.com/questions/925826