如何通过.htaccess获取不带扩展名的当前文件名?
解决Apache RewriteRule动态匹配文件名的问题
我明白你想要实现的效果:当用户访问不带扩展名的URL(比如example.com/file)时,自动跳转到对应的file.php,同时保留原有的几个排除条件(比如排除domain.co及其子域名、排除真实存在的文件/目录等)。
你的核心问题是需要捕获请求URL中的不带扩展名的文件名,然后在RewriteRule中动态引用它。下面是修正后的完整规则:
RewriteCond %{REQUEST_URI} !/$ RewriteCond %{HTTP_HOST} !^domain\.co RewriteCond %{HTTP_HOST} !^[^.]+\.(domain\.co)$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/([^/.]+)$ /$1.php [L]
关键修改点解释:
- 捕获分组
([^/.]+):这个正则表达式会匹配URL中从开头/之后的、不包含.和/的部分——也就是你要的不带扩展名的文件名(比如访问/file时,$1就会被替换成file)。 - RewriteRule的目标
/$1.php:这里用$1引用前面捕获到的分组内容,实现动态替换成对应的PHP文件。
额外注意事项:
- 如果你是在
.htaccess文件中使用规则(而非服务器配置文件httpd.conf),需要去掉开头的/——因为.htaccess中的路径是相对当前目录的,修改后的规则如下:RewriteCond %{REQUEST_URI} !/$ RewriteCond %{HTTP_HOST} !^domain\.co RewriteCond %{HTTP_HOST} !^[^.]+\.(domain\.co)$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/.]+)$ $1.php [L] - 确保你的Apache已经启用了
mod_rewrite模块,并且.htaccess文件所在目录的服务器配置中设置了AllowOverride All,否则规则无法生效。
内容的提问来源于stack exchange,提问作者Osman
相关产品推荐
相关产品推荐

