我們的網站使用以下架構:
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-z
、A-Z
和0-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
不是必須的嗎?