解决.htaccess移除根目录尾斜杠时本地重定向过多问题
解决本地与生产环境的URL尾斜杠移除冲突问题
问题原因
本地环境中localhost/mydomain.com/指向真实存在的物理目录,服务器默认会给目录请求自动添加尾斜杠;而你的重定向规则又将带斜杠的URL转为不带斜杠的版本,导致服务器反复添加、规则反复移除,形成重定向循环。生产环境正常是因为根目录并非真实物理目录,或服务器配置不会自动为根目录添加斜杠。
适配双环境的解决方案
修改.htaccess中的尾斜杠移除规则,新增排除真实目录的条件,避免循环:
RewriteEngine On # 移除尾斜杠,但跳过真实存在的目录 RewriteCond %{REQUEST_URI} ^/(.*)/$ RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ /%1 [R=301,L] # 以下为原有规则,保持不变 RewriteCond %{SERVER_PORT} 80 RewriteCond %{HTTP_HOST} ^example\.net$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.net$ RewriteRule ^(.*)$ https://example.net/$1 [R=301,L] RewriteCond %{HTTP_HOST} www.example.net RewriteRule (.*) https://example.net/$1 [R=301,L] #RewriteRule ^(.*)index\.(php|html?)$ /$1 [R=301,NC,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?url=$1 [L,QSA] #Header set X-Frame-Options "ALLOW-FROM https://whatismyscreenresolution.net/" Redirect 301 "/brand" "/brands" ErrorDocument 404 /404.php ErrorDocument 502 /502.shtml ErrorDocument 504 /504.shtml ErrorDocument 508 /508.shtml <Files ~ "\.env$"> Order Allow,Deny Deny from All </Files> <Files .htaccess> Order allow,deny Deny from All </Files> Options -Indexes <filesMatch "\.(jpg|jpeg|png|gif|ico|webp|js)$"> Header set Cache-Control "max-age=2592000, public" </filesMatch> <filesMatch "\.(css|js)$"> Header set Cache-Control "max-age=60, public" </filesMatch>
关键修改说明
新增的RewriteCond %{REQUEST_FILENAME} !-d条件会跳过真实目录的请求:
- 本地环境中,
localhost/mydomain.com/是真实目录,不会触发重定向,避免循环; - 虚拟路径(如
localhost/mydomain.com/folder/file/)不是真实目录,会正常重定向到不带斜杠的版本; - 生产环境的虚拟路径也会正常生效,和原有逻辑保持一致。
测试提示
调试时建议将R=301改为R=302临时重定向,确认规则正常后再改回301永久重定向,避免浏览器缓存旧规则导致后续调试困难。
内容的提问来源于stack exchange,提问作者Chimdi
相关产品推荐
相关产品推荐

