我的apache htaccess文件需要一些301重定向。旧URL在末尾包含变量,并具有如下结构:
/furniture-248/category/570-shelves.html?lang=en
/all-products/furniture-248/shelves.html?page=2&lang=en
/store/product/asearch.html?path=7_632&lang=en&Itemid=284
新网址不包含这种性质的参数,只是形式:
main-cat/subcat/sale.html
我在htaccess文件中尝试了常规301重定向,该文件适用于没有参数的网址,但包含?lang=en
的网址根本不起作用。
这就是我的尝试:
Redirect 301 /furniture-248/category/570-shelves.html?lang=en http://www.domain.com/shelves.html
我非常感谢任何帮助和建议。
非常感谢提前
答案 0 :(得分:0)
您不能将查询字符串用作此类重定向的一部分。你有两个选择。
选项1
采取"?lang = en" part off,只是重定向该URL的所有实例,无论查询字符串是什么。
Redirect 301 /furniture-248/category/570-shelves.html http://www.domain.com/shelves.html
这将使查询字符串保持不变,因此新的URL将包含"?lang = en"如果它存在,或任何其他查询字符串。
但是当然,你可能只需要在有"?lang = en"部分,或在重定向可能不可接受时保持查询字符串完整。在这种情况下,它需要......
选项2
使用mod_rewrite:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^lang=en$
RewriteRule ^furniture-248/category/570-shelves\.html$ http://www.domain.com/shelves.html? [R=301,L]
这完全符合您的要求,将/furniture-248/category/570-shelves.html?lang=en
重定向到http://www.domain.com/shelves.html
并且仅将其重定向。
请注意..
查询字符串是单独匹配的。
未使用匹配部分的正向斜线(因为您在网站根级别.htaccess文件中意味着打开斜杠)。
重定向网址上的结束问号很重要,因为它告诉引擎删除现有的查询字符串,这就是您想要的。
[R = 301,L]表示执行301重定向,不再处理此网址上的网址重写。
对于RewriteRule中的匹配部分," html"之前的点。是" \"因为dot在正则表达式中有特殊含义。
同样对于匹配部分,在RewriteCond和RewriteRule中,^表示字符串的开头,$表示字符串的结尾,因此我们正好匹配,而不是它可能是一个较长的字符串的一部分。
最后,如果你要添加其中的一些,你只需要" RewriteEngine On"部分一次,在顶部。每个部分都需要另外两个部分。
请务必测试使用此方法添加的所有重定向,因为mod_rewrite比我在此简单说明中提到的更多。