由于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中可能存在或不存在任何过滤器。我将非常感谢更好的解决方案。
答案 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_STATUS
与R
是为了防止无限循环。
当它正常工作时,您可以将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
进行测试。
最后一点,非常小心这些实验。我在测试期间设法杀了我的机器两次(它没有响应,我不得不关掉)。