Apache-2.2

從 example.com/.php 中刪除 .php

  • March 11, 2018

為了從我的網址中刪除 .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.

引用自:https://serverfault.com/questions/901052