HTACCESS配置SEO友好伪静态URL并禁止直接访问物理文件路径
问题原因
你的两个尝试失败分别对应以下问题:
- 第一个配置匹配规则遗漏了物理路径的
/pages/前缀,RewriteCond %{THE_REQUEST} \s/about\.php\?lang=en\s [NC]只匹配根目录下的about.php,你实际的文件存放在/pages/目录下,所以完全匹配不到请求,自然不会触发跳转。 - 第二个配置使用
%{REQUEST_URI}作为判断条件,内部重写规则执行后,URI会被改写为/pages/about.php,会再次命中前面的重定向规则,形成无限循环。
解决方案
使用%{THE_REQUEST}匹配用户浏览器发起的原始请求(该变量不会被mod_rewrite的内部重写操作修改,可以避免循环),完整可用配置如下:
RewriteEngine on RewriteBase / # 物理路径重定向到美化URL 避免重复收录 RewriteCond %{THE_REQUEST} \s/pages/about\.php\?lang=en\s [NC] RewriteRule ^ /en/about-us? [R=301,L] RewriteCond %{THE_REQUEST} \s/pages/about\.php\?lang=fr\s [NC] RewriteRule ^ /fr/a-propos? [R=301,L] # 兼容带其他查询参数的场景 RewriteCond %{THE_REQUEST} \s/pages/about\.php\?lang=en&(\S+)\s [NC] RewriteRule ^ /en/about-us?%1 [R=301,L] RewriteCond %{THE_REQUEST} \s/pages/about\.php\?lang=fr&(\S+)\s [NC] RewriteRule ^ /fr/a-propos?%1 [R=301,L] # 原有美化URL内部重写规则 RewriteCond %{QUERY_STRING} .+ RewriteRule ^(fr|en)/(a-propos|about-us)$ pages/about.php?lang=$1&%{QUERY_STRING} [L] RewriteRule ^(fr|en)/(a-propos|about-us)$ pages/about.php?lang=$1 [L]
规则说明
- 重定向规则放在最前面,仅匹配用户直接访问物理路径的原始请求,内部重写操作不会触发该规则,从根源避免循环
- 重定向规则末尾的
?作用是丢弃原始请求的lang查询参数,避免参数重复出现在美化URL后;如果需要保留除lang外的其他查询参数,使用带%1的规则即可 - 内部重写规则完全保留你原来的逻辑,不需要额外调整
内容的提问来源于stack exchange,提问作者slashroot
相关产品推荐
相关产品推荐

