mod_rewrite 301从旧网址重定向到新网址

时间:2016-06-19 21:57:45

标签: apache .htaccess redirect mod-rewrite

由于SEO原因,网站已更改其网址名称,例如它是:

/category/filter1/f00/filter2/123/filter3/100-500/filter4/36.html

现在:

/category/color/red/size/big/price/100-500/style/classic.html

我知道旧名和新名,他们已经修好了。请帮我构建一个重写规则,这将导致301从旧网址重定向到新网址。我做了研究,我发现我无法使用RewriteMap制作它,所以我最终制作了类似RewriteRule (.*)filter1(.*) $1color$2 [L]等的东西。不仅我不喜欢它看起来的样子,而且它也不会给我301重定向。

更新:请注意,目前我有几个规则,每个过滤器名称/值一个,例如:

RewriteEngine on

# make sure it's a catalog URL, not anything else
RewriteCond %{REQUEST_URI} !^/(category1|category2|category3|category4)
RewriteRule .* - [L]

# rewrite filter names
RewriteRule (.*)filter1(.*) $1color$2 [L]
RewriteRule (.*)filter2(.*) $1price$2 [L]
...etc...

它按预期工作 - 更改URL中的所有名称,但设置R标志会导致第一个规则停止并重定向到URL,如:

/var/www/vhosts/site/htdocs/category/color/red/filter2/123/ etc...

我分离了规则,因为URL中可能存在或不存在任何过滤器。我将非常感谢更好的解决方案。

2 个答案:

答案 0 :(得分:2)

这是我自己的答案:可以使用环境变量。我们需要用新的过滤器替换旧的过滤器名称和值,然后只将一个301重定向到新的URL。这里我使用mod_rewrite和环境变量做了什么:

RewriteEngine on

RewriteRule /filter1/               - [E=filters:/color/]
RewriteRule /f00[.\/]               - [E=filters:%{ENV:filters}red]
RewriteRule /0f0[.\/]               - [E=filters:%{ENV:filters}green]
RewriteRule /00f[.\/]               - [E=filters:%{ENV:filters}blue]

RewriteRule /filter2/               - [E=filters:%{ENV:filters}/size/]
RewriteRule /123[.\/]               - [E=filters:%{ENV:filters}big]
RewriteRule /32[.\/]                - [E=filters:%{ENV:filters}small]

RewriteRule /filter3/([^/^\.]+)     - [E=filters:/price/$1]

RewriteRule /filter4/               - [E=filters:%{ENV:filters}/style/]
RewriteRule /36[.\/]                - [E=filters:%{ENV:filters}classic]
RewriteRule /37[.\/]                - [E=filters:%{ENV:filters}urban]

RewriteCond %{REQUEST_URI} ^/(category1|category2|category3|category4)/
RewriteCond %{ENV:filters} !^$
RewriteRule ^([^/]+)/ /$1%{ENV:filters}.html [L,R=301]

基本上,我已经在环境变量filters中重新格式化了整个URL,然后检查它是否是一个类别而不是网站的其他部分,最后重定向到此类别+过滤器变量,附加{{1最后。

答案 1 :(得分:0)

即使新网址看起来比更漂亮,我也不确定是否需要更改 SEO 原因的现有网址。

要获得重定向而不是重写,必须使用R|redirect标志。所以你的规则看起来像是

RewriteRule (.*)filter1(.*) $1color$2 [R,L]

但如果您有多个重定向,这可能会对您的搜索引擎优化结果产生负面影响,请参阅Chained 301 redirects should be avoided for SEO , but Google will follow 2 or 3 stacked redirects

  
      
  • 请记住,理想情况下,如果您可以提供帮助,则不应该有任何堆叠重定向甚至是单个重定向,但如果需要,Google将遵循链式重定向
  •   
  • 但是,每次额外的重定向都会让Google更有可能无法遵循重定向并通过PageRank
  •   
  • 对于Google,如果必须
  • ,请将其保留为两次,最多三次重定向   
  • Bing可能不支持链式重定向
  •   

这意味着尝试一次更换多个过滤器

RewriteRule ^(.*)/filter1/(.*)/filter2/(.*)$ $1/color/$2/size/$3 [R,L]

等等。

当过滤器可能以任意顺序出现时,您可以使用多个规则并在结尾处进行重定向

RewriteRule ^(.*)filter1(.*)$ $1color$2 [L]
RewriteRule ^(.*)filter2(.*)$ $1price$2 [L]
RewriteRule ^(.*)filter3(.*)$ $1size$2 [L]

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ %{REQUEST_URI} [R,L]
<RewriteCond REDIRECT_STATUSR是为了防止无限循环。

当它正常工作时,您可以将R=301替换为SELECT t.id_user, COUNT(*) totalVisits, MAX(t.max_cons) maxCons FROM (SELECT id_user, @lastUnixTime AS lastUnixTimeOfuser, IF(@uid <> id_user, @currentMax := 1 , @currentMax), IF(@uid <> id_user, @lastUnixTime := 0, @lastUnixTime := @lastUnixTimeOfLastRecord), IF(@uid = id_user, IF((@lastUnixTime + 86400) >= utime, @currentMax := @currentMax + 1, @currentMax := 1), @lastUnixTime := 0), IF(@currentMax > @max, @max := @currentMax, @max ), IF(@uid <> id_user , @max := 1 ,@max), @uid := id_user, @lastUnixTimeOfLastRecord := utime, @max AS max_cons FROM ( SELECT id_user, (unix_time DIV 86400) * 86400 AS utime FROM requests GROUP BY id_user, utime ) dayWiseRequestTable , ( SELECT @uid := 0, @currentMax := 0, @max := 0, @lastUnixTime := 0, @lastUnixTimeOfLastRecord := 0 ) vars ORDER BY id_user, utime) t GROUP BY t.id_user; 。切勿使用R=301进行测试。

最后一点,非常小心这些实验。我在测试期间设法杀了我的机器两次(它没有响应,我不得不关掉)。