為了從我的網址中刪除 .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
.那我該如何解決這個問題呢?
答案1
您需要:
- 檢查目標檔案(帶
.php
副檔名)是否存在前內部重寫它 - 避免重寫目錄(文檔根目錄就是其中之一)。
- 避免僅重寫文檔根(如您的範例所示)。
例如,為了避免僅重寫文件根(如您的具體範例中所示),您可以修改現有RewriteCond
指令:
# Add .php extension for final internal redirect RewriteCond %{REQUEST_URI} ^(.*)$
閱讀:
RewriteCond %{REQUEST_URI} ^(/.+)$
/.+
匹配斜槓後跟某物,這將排除文檔根目錄,因為文檔根目錄本身就是一個斜線。
為了避免重寫所有目錄(文檔根目錄就是其中之一),您可以新增一個附加條件來避免重寫映射到實體目錄的 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
.