0

我一定是个白痴,因为我无法解决这个问题。

我有一个网址:www.site.com.au/products/product-name.html

我需要将这些重定向到:www.site.com.au/product-name.html

所有链接都是动态的,文件夹不存在。我用什么重写规则来完成这个?

这是我到目前为止所得到的:

RewriteCond %{HTTP_HOST} ^(www|test)\.site\.com\.au
RewriteCond %{REQUEST_URI} ^(/products/)
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^.+\.html$ ${lc:%{REQUEST_URI}} [NC,R=301,L]

只需要将位添加到远程 /products

谢谢。

4

2 回答 2

0
RewriteRule ^products(/.*)$ http://www.site.com.au$1 [L, R=301]

这将替换您列出的所有内容,除了第一个 RewriteCond (以匹配域,但如果您的 VirtualHost 仅在这两个域上回答,您可以排除该 RewriteCond 以简化它)。

RewriteRules 在 Apache 查看 RewriteConds 之前首先匹配,因此如果您可以在 RewriteRule 本身中进行匹配,它会大大简化事情。仅供您将来参考,如果您确实需要在 RewriteCond 中进行匹配,它看起来像这样:

RewriteCond %{REQUEST_URI} ^/products(/.*)$
RewriteRule ^.*$ http://www.site.com.au%1 [L, R=301]

请注意%1用于匹配 RewriteCond 中括号中的内容与$1用于匹配 RewriteRule 中的内容。

编辑:根据您的评论,以下修改应强制小写。我自己不必这样做,但根据这个 Apache 文档,它是一个通过 RewriteMap 的内部函数。根据您的原始代码,您可能已经在其他地方拥有了 RewriteMap 定义。如果没有,我已将其包含在此处。

RewriteMap lc int:tolower
RewriteCond %{REQUEST_URI} ^/products(/.*)$ [NC]
RewriteRule ^.*$ http://www.site.com.au${lc:%1} [L, R=301]
于 2013-02-10T03:26:22.133 回答
0

好的,我对 Apache Rewrite 的了解还不够,无法弄清楚确切的格式。但经过一番折腾,这些是有效的结果:

# Lowercase all /products/
RewriteCond %{HTTP_HOST} ^(www)\.site\.com\.au
RewriteCond %{REQUEST_URI} ^/products/.+\.html
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^ ${lc:%{REQUEST_URI}} [R=301,L]

# Lowercase all /products/ and strip products/ subfolder
RewriteCond %{HTTP_HOST} ^(www)\.site2\.com\.au
RewriteCond %{REQUEST_URI} ^/products/.+\.html
RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^products/(.+\.html)$ /${lc:$1} [R=301,L]

谢谢,

多姆

于 2013-02-12T04:09:06.447 回答