我index.php在/slug子目錄中有一個檔案,想根據檔案路徑加載動態內容。無論 url 是什么,內容都應該參考那個index.php.
在我下面的代碼中,沒有在 url 的末尾添加斜杠。例如,example.com/slug/33應該在地址欄中顯示為example.com/slug/33/。
我有以下 .htaccess /slug:
Options -Indexes
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /
# Dynamic url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /slug/index.php/?path=$1 [NC,L,QSA]
我嘗試/在index.php和之間添加一個,?path=$但沒有得到想要的結果。這甚至可能嗎?
uj5u.com熱心網友回復:
RewriteRule ^(.*)$ /slug/index.php/?path=$1 [NC,L,QSA]
在此處更改替換字串會更改您內部重寫的目標 - 它不會更改可見的 URL。通過在index.php您(不必要地)向應用程式接收的結果 URL 添加附加路徑名資訊 (path-info)后添加斜杠。
要更改可見 URL(附加斜杠),您需要實作外部重定向。但是,要確認……您必須已經在內部鏈接中鏈接到正確的規范 URL(即使用斜杠)。.htaccess僅當您更改了 URL 并且搜索引擎或第 3 方仍在使用舊的非規范 URL(沒有尾部斜杠)時,才將斜杠附加到 URL 中。
由于.htaccess檔案位于/slug子目錄中并且您正在該子目錄中重寫index.php,因此您不需要在重寫的 URL 前加上/slug/. 默認情況下,相對 URL 路徑相對于包含.htaccess檔案的目錄。但是,您還必須洗掉該RewriteBase指令(或將其“正確地”設定為RewriteBase /slug)。
要重定向以附加尾部斜杠,您可以在當前重寫之前添加以下內容:
# Append trailing slash if omitted
RewriteRule ^(.*(?:^|/)[^/.] )$ /slug/$1/ [R=301,L]
這需要替換字串的/slug/前綴(除非設定),否則外部重定向將嘗試重定向到檔案路徑,這將“中斷”。RewriteBase /slug
該RewriteRule 模式 ^(.*(?:^|/)[^/.] )$捕獲尚未以斜杠結尾且最后一個路徑段中不包含點的 URL 路徑。這是為了避免匹配已經包含(看起來像)檔案擴展名的 URL,即。您的靜態資源(影像、CSS、JS 等)。這應該避免需要檔案系統檢查(這是相對昂貴的) - 檢查請求是否尚未映射到檔案。雖然,如果您沒有/slug/在 URL 中使用前綴參考任何靜態資源,那么這可以簡化。
注意:您應該首先使用 302(臨時)重定向進行測驗,以避免潛在的快取問題。
在背景關系中(使用RewriteBase):
Options -Indexes
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /slug
# Append trailing slash if omitted
RewriteRule ^(.*(?:^|/)[^/.] )$ $1/ [R=301,L]
# Dynamic url
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (. ) index.php?path=$1 [QSA,L]
使用RewriteBase避免了您必須/slug/在其他指令中指定。
在正則運算式中^(.*)$,字串開始 ( ^) 和字串結束 ( $) 錨點是多余的。您也可以將其更改為使用 量詞,因為無論如何您都不想匹配基本目錄(節省了兩個額外的檔案系統檢查)。該NC標志也是多余這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/380798.html
上一篇:.htaccess重定向太多次
