移除.php扩展名并保留查询参数时遇404错误求解决
问题描述
尝试移除URL中的.php扩展名,并把查询参数q=123转成路径形式,结果出现404错误。
- 当前URL:
example.com/folder/file.php?q=123 - 期望URL:
example.com/folder/file/123
原.htaccess配置:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^\.]+)$ $1.php [NC,L] RewriteRule ^$1/(.*)$ /$1.php?q=$2
原配置的问题
- 规则顺序搞反了:得先把美观的URL转成实际的PHP文件路径,再处理无扩展名访问的规则,不然第一条规则的
L标志会直接终止后续规则执行,第二条规则根本跑不起来。 - 第二条规则语法错误:
^$1/(.*)$里的$1是无效的,没有对应的捕获组,正则根本匹配不到任何内容。 - 没做真实目录/文件的判断,可能把正常的目录访问给错误重写了。
正确的.htaccess配置
RewriteEngine On # 把 folder/file/123 这类美观URL重写为实际的 folder/file.php?q=123 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([^/]+)/([^/]+)/(\d+)$ $1/$2.php?q=$3 [L] # 允许无扩展名访问PHP文件(比如 folder/file 对应 folder/file.php) RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^([^\.]+)$ $1.php [NC,L]
规则说明
第一条规则:
- 先判断请求的不是真实目录和文件,避免干扰正常访问
- 匹配
目录/文件名/数字格式的URL,把捕获到的内容对应到目录/文件名.php?q=数字,完成重写 L标志表示匹配成功后就停止执行后续规则
第二条规则:
- 同样先排除真实目录
- 确认对应的
.php文件确实存在,避免无效请求 - 把无扩展名的请求指向对应的
.php文件,支持直接访问folder/file
内容的提问来源于stack exchange,提问作者Adir
相关产品推荐
相关产品推荐

