URL会重写问题

时间:2014-03-24 23:07:16

标签: .htaccess redirect

我们在使用.htaccess在Apache服务器上重写URL时遇到问题。

目标:将以下网址剥离其类别&子类别,同时保留通用重定向。

测试1:

Redirect 301 /category/subcategory/product http://www.site.com/product

重定向完美无缺。单个重定向到所需页面。

测试2:

RedirectMatch 301 ^/category/subcategory/.*$ http://www.site.com/category/subcategory

自行重定向适用于所有需要的网址。

问题是当我们在一个干净的.htaccess文件中有两个URL,并且重定向的顺序正确(首先是特定的,然后是一般的)时,正在使用常规重定向。

测试3:

Redirect 301 /category/subcategory/product http://www.site.com/product

RedirectMatch 301 ^/category/subcategory/.*$ http://www.site.com/category/subcategory

当我们访问www.site.com/category/subcategory/product时,结果是www.site.com/category/subcategory/product,这不是理想的结果。相反,我们希望URL为www.site.com/category/subcategory/product,

我们甚至尝试将重定向修改为: Redirect 301 /category/subcategory/product http://www.site.com/product [L] 它没有任何区别。

请帮忙!

编辑:已添加2014年3月25日

我们要做的是为从旧产品页面到新产品页面的一组已知产品提供特定的重定向。我们还尝试将剩余的未知产品的“全部捕获”重定向添加到类别页面。

以下是一个实际的重定向示例:

Redirect 301 /womens/western-dresses/stetson-cream-empire-waist-ls-western-dress http://www.site.com/stetson-cream-empire-waist-ls-western-dress

如果将上述重定向添加到.htaccess文件中,则它可以自行完美运行。

以下是第二个有效的重定向示例:

RedirectMatch 301 ^/womens/western-dresses/.*$ http://www.site.com/womens/western-dresses

问题是如果我们在.htaccess中同时存在两个规则,则按照与上面相同的顺序,始终触发第二个规则。我们尝试访问www.site.com/womens/western-dresses/stetson-cream-empire-waist-ls-western-dress,结果是www.site.com/womens/western-dresses而不是期望的结果www.site.com/stetson-cream-empire-waist-ls-western-dress

为清楚起见:

  • 如果我们删除.htaccess文件,则为网址404s

  • 如果仅列出第一条规则,则会完全触发

  • 如果仅列出第二条规则,则第二条规则完全触发

  • 如果列出了两个规则,则会触发第二个规则。

  • 我们已从.htaccess文件中删除了所有重定向。唯一的重定向是以下两行。问题仍然存在于忽略第一个重定向的位置。我们已经尝试将第一次重定向的开头改为^ / womens和^ womens,但这种改变没有效果。

Redirect 301 /womens/western-dresses/stetson-cream-empire-waist-ls-western-dress http://www.site.com/stetson-cream-empire-waist-ls-western-dress

RedirectMatch 301 ^/womens/western-dresses/.*$ http://www.site.com/womens/western-dresses

1 个答案:

答案 0 :(得分:0)

你的帖子有点令人困惑,所以我可能会误解你的目的。

如果内存服务,则在.htaccess文件中使用这些指令时,不应在模式中包含前导斜杠。该用法是为httpd.conf保留的。当这些指令在.htaccess文件中使用时,前导路径组件已被mod_access剥离。我猜这是你烦恼的原因。

例如,这应该有效(未经测试):

Redirect      301 ^category/subcategory/product http://www.site.com/product
RedirectMatch 301 ^category/subcategory/.*      http://www.site.com/category/subcategory

另外,[L]是mod_rewrite术语。 “重定向”和“RedirectMatch”是mod_access的一部分。

编辑3/25:

在.htaccess文件中使用时,Redirect和RedirectMatch可能会很繁琐,尤其是在处理不存在的文件夹和混合指令时。我可以建议你直接转到mod_rewrite吗?虽然它有一个陡峭的学习曲线,但一旦掌握了它,你将永远不会回头。

# Assuming you are in a .htaccess under DocumentRoot:
RewriteEngine On
RewriteRule ^category/subcategory/product1\.html$ /product1.html [R=301,L]
RewriteRule ^category/subcategory/product2\.html$ /product2.html [R=301,L]
RewriteRule ^category/subcategory/.*              /category/subcategory [R=301,L]

顺便说一下,这似乎是RewriteMap的合适人选,但您需要在httpd.conf中声明地图。