2015-10-06 121 views
1

我看到很多类似的问题,但没有帮助我至今:防止进入搜索引擎不友好的URL,然后重定向到搜索引擎友好的(规范)的网址

我有我的下/song/song.php脚本的逻辑?url = lang/params(seo-不友好的URL)。我用这个改写有一个友好的URL并加载从搜索引擎不友好的一个内容,使用参数语言来区分:

RewriteRule ^songs-and-chords/(.*?)(/*)?$ /song/song.php?url=en/$1 [NC,L] 
RewriteRule ^canzoni-e-accordi/(.*?)(/*)?$ /song/song.php?url=it/$1 [NC,L] 

现在我想阻止访问/song/song.php,迫使一个重定向到搜索引擎友好的一个,所以这样的事情,使用%{} THE_REQUEST使外部重定向:

RewriteCond %{THE_REQUEST} .*?song/song\.php\?url=it/(\S*) [NC] 
RewriteRule /canzoni-e-accordi/$1 [R,L] 
RewriteCond %{THE_REQUEST} .*?song/song\.php\?url=en/(\S*) [NC] 
RewriteRule /songs-and-chords/$1 [R,L] 
RewriteCond %{THE_REQUEST} ^.*?song/song\.php.*$ [NC] 
RewriteRule /songs-and-chords/ [R,L] 

但是这个规则执行...什么我做错了不?我如何以良好的方式调试这个?

(我已经在song.php脚本中使用rel =“canonical”,但仍然希望脚本根本无法访问)。

回答

1

你在做什么错了,你的RewriteRule语句的模式丢失。此外,重写的URL将使用%1参考,而不是$1

RewriteCond %{THE_REQUEST} ^GET\ /song/song\.php\?url=it/(\S+) [NC] 
RewriteRule^/canzoni-e-accordi/%1? [R=301,L] 
RewriteCond %{THE_REQUEST} ^GET\ /song/song\.php\?url=en/(\S+) [NC] 
RewriteRule^/songs-and-chords/%1? [R=301,L] 
RewriteCond %{THE_REQUEST} ^GET\ /song/song\.php\s [NC] 
RewriteRule^/songs-and-chords/ [R=301,L] 
+0

谢谢,这是正确的。唯一的问题是:这个URL /song/song.php?url=it/pink-floyd/the-wall 重定向到 /canzoni-e-accordi/pink-floyd/the-wall?url = it/pink -floyd/the-wall 如何摆脱附加的url参数? QSA标志未设置,因此它来自何处? (GET之后的“\”是什么)? – Fabbio

+1

@Fabbio将'%1'更改为'%1?'将修复重定向的url中添加的查询字符串。至于'GET \'字符串;发送给服务器的请求格式为:'GET /song/song.php?url=it/pink-floyd/the-wall HTTP/1.1'。 'GET'后我逃离了这个空间。你也可以使用'\ s'而不是'\' – hjpotter92

+0

就像一个魅力!但我现在有点失落......%1的含义是什么?这不是正则表达式的东西,对吧?我也不清楚为什么我应该用“^”来启动一个RewriteRule。你能建议关于这些问题的任何好的文档页面吗? – Fabbio