为了从我的网址中删除 .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
。