Dot-Htaccess
.htaccess 將目錄重寫為查詢變數的規則
我們的網站使用以下架構:
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-z
、A-Z
和0-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
參數不是必需的嗎?