1

我在尝试修复的网站上遇到 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]
4

2 回答 2

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]

用 指定相对 URL 的开头^,但没有指定希望它一直匹配到结尾。所以我认为正在发生的事情是它正在获取匹配的字符串部分,丢弃其他所有内容,并将其附加到/index.cfm/. 所以它只需要/category/c1234来自的部分/category/c1234garbage,因为那是匹配的部分^[a-z\d\-]+/[a-z]\d+/?

您可能只需一个单词中断即可解决此问题:

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

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

顺便说一句,这似乎还是有点尴尬。如果我理解这一点,如果它不符合您的确切模式,部分 URL 仍将被丢弃。例如/category/c1234?abc=123将丢失其查询字符串参数。您可能想要重新设计规则的设置方式。

于 2013-01-07T18:17:50.090 回答
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 规则之上。它正在做我想做的事情,即从 url 中删除垃圾,但它给了我一个无限循环,因为即使 url 是干净的,它也会重定向。有什么提示吗?

编辑:所以我意识到最后的 .+ 也匹配数字......我如何更改它以匹配数字后面的数字以外的任何内容?基本上我有 .+ 我需要有一个“匹配除数字以外的任何字符”

编辑:我终于让它与以下代码一起工作:

# 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 这样的东西

于 2013-01-07T22:18:18.460 回答