301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL

Posted

技术标签:

【中文标题】301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL【英文标题】:301 redirect query string to SEO friendly URLs through .htaccess 【发布时间】:2011-08-13 00:19:55 【问题描述】:

我在我的 .htaccess 文件中编写了一些代码,它允许使用对 SEO 友好的 URL,而不是丑陋的查询字符串。以下代码将浏览器中的 SEO 友好版本重写为服务器上的查询字符串版本。

RewriteEngine On
RewriteRule ^seo/([^/]*)/$ /directory/script.php?size=large&colour=green&pattern=$1 [L]

这样丑

http://www.mysite.com/directory/script.php?size=large&colour=green&pattern=striped

现在很漂亮

http://www.mysite.com/directory/seo/striped/

只是为了解释一下代码; seo是用来给URL添加更多关键字的,/directory/是.htaccess文件所在的目录,参数size=largecolour=green永远不会改变,而pattern=$1可以是很多不同的值。

上面的代码完美运行。但是,问题是我现在被两个指向完全相同内容的 URL 卡住了。为了解决这个问题,我想将旧的、丑陋的查询字符串 301 重定向到 SEO 友好的 URL。到目前为止我尝试过的方法都不起作用 - Google 今天也不是特别友好。

任何人都可以提供工作代码放入我的 .htaccess 文件中,将丑陋的重定向到新的 URL,同时保留重写?谢谢!

【问题讨论】:

添加了更多示例 URL 以进行说明。 【参考方案1】:

这应该可以解决问题:

重写引擎开启

## Redirect to pretty urls
# The '%1' in the rewrite comes from the group in the previous RewriteCond
RewriteCond %REQUEST_URI !seo
RewriteCond %QUERY_STRING ^size=large&colour=green&pattern=([a-zA-Z]*)$
RewriteRule (.*) /directory\/seo\/%1\/? [L,R=301]

## Rewrite to long url, additional parameter at the end will cause
## the internal redirect not to match the previous rule (would cause redirect loop)
RewriteRule ^directory\/seo\/([^/]*)/$ /directory/script.php? size=large&colour=green&pattern=$1&rewrite [L]

如果需要,您还可以匹配大小和颜色,也可以将它们更改为正则表达式组,并使用相应的%N

希望这会有所帮助。

【讨论】:

感谢您的回答。我试过你的代码;最初,由于代码最后一行的一些额外间距导致内部服务器错误,我将其删除。现在代码导致重定向循环。您的代码是要与我的代码一起运行还是要完全替换它?如果我删除我的代码重定向成功,但会导致 404 错误(似乎不再重写 URL)非常感谢您的 cmets。 嗯,删除了多余的空间,当我粘贴我的答案时一定发生了。无论如何......它是为了替换你的。不过,我现在确实看到了差异。您的初始规则设置为匹配以 /seo 开头的 URL,但您的示例重定向 URL 为 /directory/seo。我的重写设置为匹配后者。如果你能解决这个问题,我们应该能够让它工作。 感谢您的回复,已成功使用我们的代码组合来完成这项工作,如下所示:RewriteCond %REQUEST_URI !seoRewriteCond %QUERY_STRING ^size=large&colour=green&pattern=([a-zA-Z0-9_-]*)$RewriteRule (.*) /directory\/seo\/%1\/? [L,R=301]RewriteRule ^seo/([^/]*)/$ /directory/size=large&colour=green&pattern=$1&rewrite [L]【参考方案2】:

未经测试,但这可能有效...

RewriteRule ^directory/script.php?size=large&colour=green&pattern=(.*)$ /seo/$1/? [R=301,NE,NC,L]

【讨论】:

感谢您的回答;恐怕我无法让这个工作。没有重定向。

以上是关于301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 中带有查询字符串的 301 的正确语法是啥? [关闭]

301 Htaccess 重写规则查询字符串

301 重定向没有子目录/查询字符串

.htaccess 规则将图像文件的直接视图重定向到页面,图像作为查询字符串传递

htaccess 301 重定向某些 URL 模式

Htaccess - 将下划线结合到连字符和大写到小写 301 重定向