.htaccess带连字符URL重定向404 前置规则是否存在干扰?
核心问题原因
- 路径正则写法错误:在目录级
.htaccess中运行重写规则时,RewriteRule匹配的是相对当前.htaccess位置的路径,不会携带路径开头的斜杠/,你写的^/fol-der-name/正则从根本上无法匹配任何请求。 - 规则顺序完全错误:mod_rewrite按从上到下的顺序执行规则,你把通用PHP后缀补全规则放在了vlog业务规则前面,请求vlog路径时会先被后缀规则拦截。
- 后缀规则逻辑缺失:原有的PHP后缀补全规则没有判断补全后的
.php文件是否真实存在,会给所有非目录路径强行加上.php后缀,vlog路径被改写成不存在的php文件后直接触发404,根本轮不到后面的vlog规则执行。 - 捕获组用法错误:
%1用来引用上一个RewriteCond中捕获的分组内容,你的vlog规则没有配套的匹配条件,用%1无法获取到路径值,必须用$1引用当前RewriteRule括号内捕获的分组。 - 缺少规则终止标记:所有规则都没加
[L](last,停止执行后续规则)标记,重写完成后会继续被其他规则二次改写,引发路径错误。 - 基础跳转逻辑漏洞:原有的HTTPS、www跳转逻辑只处理了带www的场景,没有覆盖普通HTTP请求强制跳HTTPS的需求,URL规整逻辑本身不完整。
修正后的完整可用配置
RewriteEngine on # 允许跟随符号链接 Options +FollowSymLinks # ---------- 第一部分:外部URL规整跳转,所有跳转类规则放最前面 ---------- # 合并强制HTTPS、移除www前缀逻辑,避免多次跳转 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC] RewriteRule ^ https://%1%{REQUEST_URI} [R=302,L] # 移除非目录路径末尾的斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [R=302,L] # 外部跳转移除URL中的.php后缀,避免暴露后端文件路径 RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^\ ]+)\.php(\?|\ ) RewriteRule ^/?(.*)\.php$ /$1 [R=302,L] # ---------- 第二部分:内部重写规则,业务特殊规则优先于通用规则 ---------- # vlog路径统一转发到处理页面,加QSA标记保留原URL携带的查询参数 # 如果.htaccess放在网站根目录,使用下面这行 RewriteRule ^fol-der-name/(.+)$ /fol-der-name/vlog.php?url=$1 [L,QSA] # 如果.htaccess直接放在fol-der-name目录内,注释上面那行,改用下面这行即可 # RewriteRule ^(.+)$ vlog.php?url=$1 [L,QSA] # 通用PHP后缀补全:仅当对应php文件真实存在时才补全后缀 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^([^.]+)$ $1.php [NC,L]
配置注意事项
- 测试阶段全部使用
302临时跳转,等所有规则验证符合预期后,再把跳转标记改成301永久跳转,避免浏览器缓存错误的跳转规则难以清理。 - 内部重写规则的优先级一定是「特殊业务规则 > 通用规则」,避免通用规则提前拦截业务请求。
- 如果vlog页面本身需要接收原URL附带的其他GET参数,一定要加
[QSA]标记,否则原参数会被重写的url=$1覆盖。
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

