了解RegEx - 上一期的SEO重复

时间:2013-01-07 17:15:32

标签: regex .htaccess

我在我试图修复的网站上有重复SEO页面的问题。 www.example.com/category/c1234加载与www.example.com/category/c1234garbage相同 我一直在线阅读并测试代码,到目前为止,我将其缩小到可能的正则表达式问题。我有以下几行

# url rewrites
RewriteCond %{REQUEST_URI} ^/index\.cfm/.+ [NC]
RewriteRule ^/index.cfm/(([^/]+)/?([^/]+)?)/?(.*)? /index.cfm/$4?$2=$3 [NS,NC,QSA,N,E=SESDONE:true]  

我在规则中添加了一个R,所以我可以看到它是否正在通过那里,它是在它通过之后,最后的垃圾消失了。 有人可以帮助我理解这一点,并想办法解决这个问题,所以当你访问www.example.com/category/c1234garbage时,它会重定向到www.example.com/category/c1234

我现在已经在网上搜索了很长一段时间,并认为可能是时候发帖了,因为我似乎无法找到解决方案。我正在阅读“掌握正则表达式”,但我可能需要一段时间才能找到我正在寻找的答案。 我感谢你能给我的任何帮助。谢谢。

编辑:这就是我之前所拥有的     RewriteEngine On     Rewritebase /

# remove trailing index.cfm
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^index.cfm(\?)?$ / [R=301,L]

# remove trailing slash
RewriteCond %{QUERY_STRING} ^$
RewriteRule (.*)/$ /$1 [R=301,L]

# Remove trailing ?
RewriteCond %{THE_REQUEST} \?\ HTTP [NC] 
RewriteRule ^/?(index\.cfm)? /? [R=301,L]

# SEF URLs
SetEnv SEF_REQUEST false
RewriteRule ^[a-z\d\-]+/[a-z]\d+/? /index.cfm/$0 [NC,PT,QSA,E=SEF_REQUEST:true]
RequestHeader add SEF-Request %{SEF_REQUEST}e
RewriteCond %{HTTP:SEF_REQUES} ^true$ [NC]
RewriteRule . - [L]
编辑:我正在再次阅读htaccess并发现这个我不明白,但它可能有一些联系。它位于文件的底部。

# lowercase the hostname, and set the TLD name to an enviroment variable
RewriteCond ${lowercase:%{SERVER_NAME}|NONE}  ^(.+)$
RewriteCond %1  ^[a-z0-9.-]*?[.]{0,1}([a-z0-9-]*?\.[a-z.]{2,6})$
RewriteRule .? - [E=TLDName:%1]

2 个答案:

答案 0 :(得分:1)

根据您的描述和您的代码,听起来这是正在发生的转变:

www.example.com/category/c1234garbage
↓
www.example.com/index.cfm?category=c1234garbage 

所以问题,我认为,不是你的重写规则。问题是你如何处理服务器端的查询字符串参数。如果您有一个名为index.cfm的实际页面正在解释这些参数,则应调整该页面后面的代码以验证它们并在适当的位置重定向到/category/c1234

我认为index.cfm中的代码正在查看参数,检查启动是否具有可识别的内容,并从那里开始。你需要更加严格。

或者,您可以添加另一个.htaccess规则来解析c1234garbage部分并确定哪个部分有效,哪个部分(如果有)是垃圾。但是,我不能给你一个正则表达式,因为我不知道应用程序中有效输入的规则。


编辑:

我想我发现了这个问题。这部分在这里:

RewriteRule ^[a-z\d\-]+/[a-z]\d+/? /index.cfm/$0 [NC,PT,QSA,E=SEF_REQUEST:true]

您使用^指定相对网址的开头,但未指定您希望它始终匹配到结尾。所以我认为正在发生的事情是它将匹配的字符串中的一部分丢弃,抛弃其他所有内容,然后将其附加到/index.cfm/。因此,只需/category/c1234的{​​{1}}部分,因为这是匹配/category/c1234garbage的部分。

你可以用一个单词中断解决这个问题:

^[a-z\d\-]+/[a-z]\d+/?

如果这不起作用,恐怕我们已经达到了htaccess知识的终点。我更像是一个正则表达式的人。

顺便说一句,这似乎有点尴尬。如果我理解这一点,如果URL不符合您的确切模式,则部分URL仍将被抛弃。例如。 RewriteRule ^[a-z\d\-]+/[a-z]\d+\b/? /index.cfm/$0 [NC,PT,QSA,E=SEF_REQUEST:true] 将丢失其查询字符串参数。您可能想重新设计规则的设置方式。

答案 1 :(得分:0)

我部分解决了这个问题。我添加了

# Remove garbage from after category
RewriteCond %{REQUEST_URI} [a-z\d\-]+/[a-z]\d+(.+)
RewriteRule ^([a-z\d\-]+/[a-z]\d+)/? $1 [R=301]

在SEF规则之上。它正在做我想要的是从网址中删除垃圾,但它给了我一个无限循环,因为它重定向即使网址是干净的。任何提示?

编辑:所以我意识到。+最后的数字也匹配了数字......如何更改它以匹配数字后的数字以外的任何数字?基本上我在哪里。+我需要“匹配除数字之外的任何字符”

编辑:我终于使用以下代码:

# Remove garbage from after category
RewriteCond %{REQUEST_URI} [a-z\d\-]+/[a-z]\d+[A-Za-z-.]+
RewriteRule ^([a-z\d\-]+/[a-z]\d+)/? $1 [R=301]

我之前使用的(。+)正在阅读第二个数字(c1234)作为其中的一部分。所以它总是将条件传递为真,除非它像c1