为什么谷歌索引友好的URL混合了连字符和%20


Why is Google indexing Friendly URL mixed with hyphens and %20?

我从头开始开发了一个博客,到目前为止一切都很顺利。我终于开始写我的第一篇文章了,我一直在等待谷歌对这个特定的页面进行索引,以确保它没有任何问题。好吧,谷歌目前正在对同一页面进行4次索引,我(在stackoverflow用户的帮助下)在我的htaccess上有一个mod_rewrite,可以将所有URL重写为来自特定文件(article.php)的连字符。

我目前的文章页面如下。示例:www.site.com/article.php?article_id=10&article_title=friendly url goes over here

使用mod_rewrite,我将url更改为以下内容。

www.site.com/article/id/friendly-url-goes-over-here

但谷歌似乎对同一页面进行了4次这样的索引。

www.site.com/article/10/friendly-url-goes-over-here
www.site.com/article/10/friendly-url-goes%20over%20here
www.site.com/article/10/friendly-url%20goes%20over%20here
www.site.com/article/10/friendly%20-url%20goes%20over%20here

为什么它为同一页的4个索引?它似乎会索引页面每个连字符插入的次数,所以如果有10个连字符,我猜谷歌会索引同一页面的10个。。这是我所有的htaccess文件。

RewriteEngine on
# add www before hostname
RewriteCond %{HTTP_HOST} ^oddify'.co$ [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=302,L,NE]
# if on article page, get slugs and make into friendly url
RewriteCond %{THE_REQUEST} 's/article'.php'?article_uid=([^&]+)&article_title=([^&' ]+)
RewriteRule ^ /article/%1/%2/? [L,R=302,NE]
# if page with .php is requested then remove the extension
RewriteCond %{THE_REQUEST} 's/+(.+?)'.php['s?] [NC]
RewriteRule ^ /%1/ [R=302,L,NE]
RewriteRule "^(article)/([^ ]*) +(.*)$" /$1/$2-$3 [L,R]
# Force a trailing slash to be added
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} 's/+([^.]+?[^/.])['s?] [NC]
RewriteRule ^ /%1/ [R=302,L]
# allow page direction to change the slugs into friendly seo URL
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (?:^|/)article/([^/]+)/([^/]+)/?$ /webroot/article.php?article_uid=$1&article_title=$2 [L,QSA,NC]
# silently rewrite to webroot
RewriteCond %{REQUEST_URI} !/webroot/ [NC]
RewriteRule ^ /webroot%{REQUEST_URI} [L]
# .php ext hiding
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

我几天前写了这个问题,我确保从谷歌上删除页面索引,然后现在谷歌已经开始以同样的方式重新索引它们

以下是显示4个索引页面的谷歌页面:谷歌搜索页面

.htaccess文件的问题是,对于标题中的每个空格,它都会进行一次重定向。使用永久重定向(301)可能会也可能不会修复它,但即使这样,如果标题中出现太多空格,浏览器也会出现错误(检测到重定向循环)。你可以通过在服务器上完成这两个问题:

RewriteRule ^article/([^' ]*)' ([^' ]*' .*) /article/$1-$2 [N]
RewriteRule ^article/([^' ]*)' ([^' ]*)$ /article/$1-$2 [L,R=301]

如果url中至少出现2个空格,则第一条规则匹配,并将重写其中一个空格,并命令Apache再次遍历.htaccess文件([N])。如果只剩下一个空间,第二个规则将匹配,除了重写最后一个空间外,它还将重定向用户。这将只是一次重定向,希望永久重定向将导致只有新的url在谷歌中可见。

如果url中的空间超过Apache允许的内部递归,这将导致内部服务器错误。如果您有权访问httpd.conf,则可以更改LimitInternalRecursion以允许更多的内部递归警告:将其设置为SANE编号。如果由于某种原因,您的"重写规则"中有一个无休止的循环,而这个数字高得离谱,您将锁定服务器,直到达到这个限制。请参阅文档。

尝试将此重定向更改为301:

RewriteRule "^(article)/([^ ]*) +(.*)$" /$1/$2-$3 [L,R=301]

301状态告诉谷歌(以及浏览器和其他客户端)重定向是永久的,不应该再考虑旧的URL(带空格的URL)。