Dot-Htaccess

.htaccess 將目錄重寫為查詢變數的規則

  • January 27, 2020

我們的網站使用以下架構:

example.com/channels/channel_name?v=videoId

我希望能夠擷取channel_name目錄並將其重寫為查詢變數,如下所示:

example.com/channels?watch=channel_name&v=videoId

.htaccess在屏蔽使用者轉換的同時保留任何尾隨參數變數的正確語法是什麼?

example.com/channels?watch=channel_name&v=videoId

由於您尚未確定實際處理此請求的腳本(即前端控制器),因此尚不清楚您在這裡嘗試做什麼。讀取 URL 參數並最終提供內容的腳本的名稱是什麼?

您已經聲明這/channels是文件系統上的物理目錄(因此 URL 路徑至少需要以斜杠結尾,即。/channels/?watch=channel_name&v=videoId)所以這不是嚴格意義上的重寫端點(因為它仍然需要對實際上會做某事的腳本進行額外的重寫)。它需要採用以下形式(假設是 PHP):

example.com/channels/front-controller.php?watch=channel_name&v=videoId

實際處理請求的腳本在哪裡front-controller.php(即前端控制器)。

為了實現這種重寫(來自/channels/channel_name?v=videoId),您可以在根.htaccess文件中執行以下操作:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^(v=videoId)$
RewriteRule ^channels/([\w]+)$ channels/front-controller.php?watch=$1&%1 [QSA,L]

其中channel_name可以由字元a-zA-Z0-9_涵蓋您的範例 URL)組成。

/channels/front-controller.php是實際處理請求並返回內容的腳本。雖然,這可以在任何地方,但它不需要在/channels目錄中(事實上,如果不是,它會更容易 - 以避免潛在的衝突)。

%1是對前面的CondPattern中擷取的組的反向引用。IE。價值v=videoId。節省重複。

這是內部重寫- 使用者看到的 URL 保持為/channels/channel_name?v=videoId.

我有一個解決方法:

RewriteRule ^channels/(.*)$ /watch/?channel=$1 [R=302,NC,QSA,L]

雖然這是一個外部重定向- 使用者看到的 URL 被修改為新的 URL。在這種情況下,哪個文件處理請求?v=videoId參數不是必需的嗎?

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