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

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

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

example.com/channels/channel_name?v=videoId

我希望能夠捕獲channel_name目錄並將其重寫為查詢變量,如下所示:

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

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

答案1

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是對前面捕獲的組的反向引用條件模式。 IE。價值v=videoId。節省重複。

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

我有一個解決方案:

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

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

相關內容