從 example.com/.php 刪除 .php

從 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.那我該如何解決這個問題呢?

答案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.

相關內容