Apache-2.2
從 example.com/.php 中刪除 .php
為了從我的網址中刪除 .php,我目前有以下內容
# Remove trailing slashes RewriteRule ^(.*)\/$ $1 [NC,L,R=301] # Remove trailing .php extensions RewriteCond %{THE_REQUEST} (\S*?)/(.*?)\.php [NC] RewriteRule ^ %1/%2 [L,R=301] # Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$ RewriteRule !\.php$ %1.php [NC,L]
但是這些規則不適用於 bare
example.com
,因為它以example.com/.php
. 那麼我該如何解決呢?
您需要:
- 在內部重寫之前檢查目標文件(帶有
.php
副檔名)是否存在- 避免重寫目錄(文件根目錄是其中之一)。
- 避免僅重寫文件根目錄(如您的範例中所示)。
例如,為了避免僅重寫文件根目錄,如您的具體範例中那樣,您可以修改現有
RewriteCond
指令:# Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$
讀書:
RewriteCond %{REQUEST_URI} ^(/.+)$
/.+
匹配後跟一個斜線的something,這將排除文件根目錄,因為文件根目錄本身就是一個斜線。為了避免重寫所有目錄(文件根目錄是其中一個),您可以添加一個附加條件來避免重寫映射到物理目錄的 URL。例如:
RewriteCond %{REQUEST_URI} ^(/.+)$ RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !\.php$ %1.php [NC,L]
但是,如果您有可訪問的目錄,則應修改現有規則以刪除尾部斜杠,否則,在請求目錄時可能會出現重定向循環(因為 mod_dir 預設情況下會附加斜杠)。例如:
# Remove trailing slashes RewriteRule ^(.*)\/$ $1 [NC,L,R=301]
應修改為包含與上述相同的條件:
# Remove trailing slashes, unless the request maps to a directory RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ $1 [L,R=301]
此外,這裡不需要
NC
標誌。並且沒有必要逃避RewriteRule
模式中的斜線。我假設您還必須
RewriteBase
在文件的其他位置定義一個指令,否則,這可能會導致.htaccess
.