如何在.htaccess中先重定向带尾斜杠URL再进行友好URL重写?
问题:带尾斜杠URL的重定向与友好URL重写结合实现
我已知在.htaccess文件中可通过以下规则实现友好URL重写:
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+?)$ /index.php?index=$1 [L,QSA]
该规则可将www.example.com/doit重写为www.example.com/index.php?index=doit,由index.php处理后续逻辑。但我还想处理带尾斜杠的URL,尝试过使用:
RewriteRule ^(.+?)/?$ /index.php?index=$1 [L,QSA]
此规则虽能正常重写,但URL会保留尾斜杠,还可能导致页面识别目录错误。我希望先捕获带尾斜杠的URL(如www.example.com/doit/),将其重定向到无尾斜杠版本(www.example.com/doit),再执行原有的友好URL重写,请问这是否可行?
解决方案
当然可行,只需要在原有重写规则之前添加一条专门的重定向规则,先处理带尾斜杠的URL,再执行内部重写。具体配置如下:
# 1. 重定向带尾斜杠的URL到无尾斜杠版本(排除真实存在的目录) RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ /$1 [R=301,L] # 2. 原有友好URL重写规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)$ /index.php?index=$1 [L,QSA]
规则细节说明:
- 第一条规则里的
RewriteCond %{REQUEST_FILENAME} !-d是关键,用来排除服务器上真实存在的目录(比如www.example.com/uploads/这类真实目录,保留它的尾斜杠更合理,避免干扰正常访问)。 RewriteRule ^(.+)/$ /$1 [R=301,L]会匹配所有以尾斜杠结尾且不是真实目录的URL,通过R=301做永久重定向到去掉尾斜杠的版本,L标记表示处理完这条规则就停止当前循环,浏览器地址栏会同步更新为无尾斜杠的URL。- 完成重定向后,请求会重新进入规则匹配,此时执行原有重写规则,就能正常将无尾斜杠的URL重写到
index.php处理逻辑。
提示:如果是测试阶段,建议先用R=302临时重定向,确认规则生效且无问题后,再改成R=301永久重定向(永久重定向对SEO更友好,能帮助搜索引擎更新URL索引)。
内容的提问来源于stack exchange,提问作者Manngo
相关产品推荐
相关产品推荐

