从 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

相关内容