带查询字符串的跨域名重定向失效:动态静态URL重定向求助
解决跨域名动态/静态URL重定向失效问题
嘿,我来帮你搞定域名迁移时的重定向问题!你现在遇到的动态URL重定向失效,主要是两个小问题:请求路径匹配错了,还有规则执行顺序不对,咱们一个个来修正:
1. 先把单个动态URL的重定向改对
你的原URL是http://www.bercsekft.hu/motorosbolt/index.php?id=546,但你写的规则里RewriteCond %{REQUEST_URI} ^/index.php$只匹配根目录下的index.php,完全没考虑前面的/motorosbolt/路径,这就是为啥规则不生效的核心原因!
而且要记得把这条特定的重定向规则放在最前面,不然会被后面的通用规则提前拦截。修正后的规则是这样的:
RewriteEngine On # 优先处理这个特定的动态URL重定向 RewriteCond %{HTTP_HOST} ^(www\.)?bercsekft\.hu$ RewriteCond %{REQUEST_URI} ^/motorosbolt/index\.php$ RewriteCond %{QUERY_STRING} ^id=546$ RewriteRule ^ https://www.bercsemotor.hu/k/robogo-alkatreszek/aprilia-alkatreszek/aprilia-kormany-alkatresz? [R=301,L]
我给你加了几个细节:
- 加上
%{HTTP_HOST}的条件,确保只有旧域名的请求才会触发这个重定向 - 把
REQUEST_URI改成^/motorosbolt/index\.php$,精准匹配原URL的路径 - 规则结尾加了个
?,这样会自动清除原URL的?id=546参数,避免目标URL带多余的尾巴 R=301是永久重定向,对SEO友好,测试的时候可以先改成R=302(临时重定向),避免浏览器缓存错误规则
2. 调整现有规则的顺序和写法
你原来的那些通用规则(比如裸域名跳www、目录跳转),要放在特定重定向的后面,同时我帮你简化了写法,去掉了没必要的引号和转义符,看起来更清爽:
# 接上面的特定重定向之后,放通用规则 # 旧域名裸域跳www RewriteCond %{HTTP_HOST} ^bercsekft\.hu$ RewriteRule ^(.*)$ http://www.bercsekft.hu/$1 [R=301,L] # /jarmu 跳转到 /motorosbolt RewriteCond %{HTTP_HOST} ^(www\.)?bercsekft\.hu$ RewriteRule ^jarmu\/?$ /motorosbolt [R=301,L] # /edeny 和 /edenybolt 跳转到子域名 RewriteCond %{HTTP_HOST} ^(www\.)?bercsekft\.hu$ RewriteRule ^edeny\/?$ http://konyhafelszereles.bercsekft.hu/ [R=301,L] RewriteCond %{HTTP_HOST} ^(www\.)?bercsekft\.hu$ RewriteRule ^edenybolt\/?$ http://konyhafelszereles.bercsekft.hu/ [R=301,L] # sitemap的内部重写 RewriteBase / RewriteRule ^sitemap\.xml$ motorosbolt/sitemap2.php [L] # PHP handler 保持原样就行,别改 # php -- BEGIN cPanel-generated handler, do not edit # Set the “ea-php52” package as the default “PHP” programming language. <IfModule mime_module> AddHandler application/x-httpd-ea-php52___lsphp .php .php5 .phtml </IfModule> # php -- END cPanel-generated handler, do not edit
3. 如果有大量动态URL要重定向(可选)
如果你还有很多类似id=XXX的动态URL需要转成新域名的静态路径,要是ID和新路径有规律,可以用批量规则,比如:
# 示例:批量匹配id参数,根据ID生成目标路径 RewriteCond %{HTTP_HOST} ^(www\.)?bercsekft\.hu$ RewriteCond %{REQUEST_URI} ^/motorosbolt/index\.php$ RewriteCond %{QUERY_STRING} ^id=(\d+)$ # 这里用$1引用匹配到的ID值,比如如果ID对应不同的分类路径,可以灵活调整 RewriteRule ^ https://www.bercsemotor.hu/k/robogo-alkatreszek/aprilia-alkatreszek/aprilia-kormany-alkatresz-$1? [R=301,L]
要是没规律,那就只能像第一条那样逐个添加特定规则,记得都放在最前面就行。
最后给你几个测试小技巧
- 测试时先把
R=301改成R=302,测试没问题再改回301,不然浏览器缓存了错误规则,改起来麻烦 - 用浏览器的开发者工具(Network面板)看一下重定向的状态码,确认是不是返回301
- 测试前一定要清浏览器缓存,或者用无痕模式打开,避免旧缓存干扰结果
内容的提问来源于stack exchange,提问作者Jancso
相关产品推荐
相关产品推荐

