如何配置.htaccess实现无尾斜杠的URL参数重写?
解决.htaccess无尾斜杠URL重写问题
嘿,我来帮你搞定这个重写规则的问题!你遇到的情况很常见——直接用RewriteRule "(.*)$" "/index.php?code=$1"会触发无限循环,还会误匹配静态资源(比如CSS、JS、图片),所以才会失效。下面给你一步步的解决方案:
核心问题分析
你的第二个规则(.*)$会匹配所有请求,包括index.php本身,当服务器重写到index.php?code=index.php后,这个规则又会再次匹配,陷入循环。另外,它还会把你的静态资源(比如/style.css)也重写成index.php?code=style.css,这显然不是你想要的。
解决方案:添加条件限制+正确规则
下面是经过验证的完整规则,既能处理无尾斜杠的URL,又不会干扰正常资源:
RewriteEngine On # 可选:把带尾斜杠的URL重定向到无尾斜杠版本(利于SEO,避免重复内容) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [R=301,L] # 核心重写规则:仅匹配非真实文件/目录,且排除目标文件index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/index\.php$ RewriteRule ^(.*)$ /index.php?code=$1 [L,QSA]
规则详解
RewriteEngine On:开启Apache的重写引擎,这是所有重写规则的前提- 带尾斜杠的重定向(可选):
RewriteCond %{REQUEST_FILENAME} !-d:排除真实存在的目录(比如/images/这样的实际目录不会被重定向)RewriteRule ^(.*)/$ /$1 [R=301,L]:把example.com/abc123/永久重定向到example.com/abc123,[L]表示匹配后停止后续规则
- 核心重写规则:
RewriteCond %{REQUEST_FILENAME} !-f:如果请求的不是真实存在的文件(比如style.css不会被重写)RewriteCond %{REQUEST_FILENAME} !-d:如果请求的不是真实存在的目录RewriteCond %{REQUEST_URI} !^/index\.php$:排除目标文件index.php,防止循环RewriteRule ^(.*)$ /index.php?code=$1 [L,QSA]:把所有符合条件的URL重写到index.php?code=xxx,[QSA]表示保留原URL的查询字符串(比如example.com/abc123?foo=bar会变成index.php?code=abc123&foo=bar)
额外注意事项
- 确保你的Apache服务器已经开启了
mod_rewrite模块 .htaccess文件要放在网站的根目录下- 如果使用了301重定向,测试时记得清空浏览器缓存(301会被浏览器长期缓存)
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

