我有這個用戶生成的 URL:https://example.com/watch.php?name=I9an9O.mp4
我想要實作的是抓住介于兩者之間的部分 name=(.mp4即。I9an9O)
這就是我希望 URL 的樣子:https://example.com/I9an9O
我嘗試將此代碼放入.htaccess:
RewriteEngine On
RewriteRule ^([^/]*)\.html$ /watch.php?name=$1 [L]
不幸的是,我只能洗掉前面的部分,I9an9O但不能洗掉I9an9O. 我使用了這個在線 Mod 重寫工具:https ://www.generateit.net/mod-rewrite/index.php
使用后,結果是:https://example.com/I9an9O.mp4.html
我究竟做錯了什么?
uj5u.com熱心網友回復:
RewriteRule ^([^/]*)\.html$ /watch.php?name=$1 [L]
不知道為什么要匹配以.htmlwhen 你的 URL 應該看起來像結尾的 URL /I9an9O。
你需要做這樣的事情:
RewriteRule ^\w $ watch.php?name=$0.mp4 [L]
\w是一個速記字符類,僅匹配大寫/小寫字母、數字和下劃線。因此不會匹配包含點的 URL(以避免與諸如 的實際檔案沖突watch.php)或包含多個路徑段(檔案夾)的 URL。使用更通用的正則運算式[^/]*(如您的原始示例)的問題在于它也可能匹配watch.php,從而創建一個無限回圈。
反向參考包含與模式匹配的$0整個 URL 路徑。RewriteRule
您應該/I9an9O在 HTML 源代碼中鏈接到表單的 URL。
如果要更改現有 URL 結構,則還需要將表單的“舊”請求重定向/watch.php?name=I9an9O.mp4到新 URL。此重定向需要在上述重寫之前進行。
完整的.htaccess檔案將如下所示:
Options -MultiViews
RewriteEngine On
# Redirect direct requests to "/watch.php?name=<name>.mp4" to "/<name>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^name=(\w )\.mp4
RewriteRule ^watch\.php$ /%1 [QSD,R=301,L]
# Rewrite requests of the form "/<name>" to "watch.php?name=<name>.mp4"
RewriteRule ^\w $ watch.php?name=$0.mp4 [L]
其中%1第一個RewriteRule是對前面CondPattern中捕獲的子模式的反向參考。IE。的I9an9O部分name=I9an9O.mp4。
該QSD標志是從請求中丟棄原始查詢字串所必需的。
在更改為 301(永久)之前先使用 302(臨時)重定向進行測驗,以避免潛在的快取問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/482030.html
