Apache RewriteRule求助:移除?id=查询串后页面404
解决方案
你的规则仅完成了外部重定向(将带?id=的URL跳转到无参数的干净URL),但服务器无法识别新的干净URL对应的内容,因此返回404。需要同时配置内部重写,让服务器能把干净URL映射回原有的参数路由逻辑。
正确的Apache Rewrite配置
RewriteEngine On # 1. 外部301重定向:移除?id=查询串,跳转至干净URL RewriteCond %{QUERY_STRING} ^id=([^&]+)$ [NC] RewriteRule ^news-and-events/news/$ /news-and-events/news/%1? [R=301,L] # 2. 内部重写:将干净URL转换为带?id=参数的请求,确保服务器能识别 RewriteRule ^news-and-events/news/([^/]+)$ /news-and-events/news/?id=$1 [L]
配置说明
- 第一步重定向:精准匹配
?id=xxx格式的查询串,将xxx部分拼接至原路径末尾,同时移除查询串,返回301状态码告知搜索引擎更新索引。限定路径^news-and-events/news/$避免影响站点其他URL。 - 第二步内部重写:当用户访问
/news-and-events/news/xxx时,服务器内部自动将其转换为/news-and-events/news/?id=xxx的请求,既保留了用户看到的干净URL,又让原页面逻辑能正常加载内容。
其他环境适配(Nginx)
如果使用Nginx服务器,配置逻辑一致但语法不同:
# 外部重定向 rewrite ^/news-and-events/news/$ /news-and-events/news/$arg_id? permanent; # 内部重写 rewrite ^/news-and-events/news/([^/]+)$ /news-and-events/news/?id=$1 last;
注意事项
- 测试阶段可先将
R=301改为R=302(临时重定向),确认配置无误后再换回301,避免浏览器缓存错误配置。 - 确保服务器已启用Rewrite模块(Apache的
mod_rewrite、Nginx的rewrite模块)。
内容的提问来源于stack exchange,提问作者Rob Jones
相关产品推荐
相关产品推荐

