简单地说,我是在我的网站上工作,以使搜索引擎优化友好。我想做到以下几点:
example.com/////something///到example.com/something//?id=something/到新的urls /something/)我想出了一个.htaccess代码:
RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R=301]
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{QUERY_STRING} ^id=([a-z0-9\/-]+)
RewriteRule ^(.*)$ http://example.com/%1? [R=301]
RewriteRule ^index.php(.*)$ /$1 [R=301]
RewriteRule ^([a-z0-9\/-]+)$ /?id=$1 [L] ...and虽然正在工作,但它有一个副作用:链重定向,例如。example.com/?id=something////// -> example.com/something////// -> example.com/something/
那么,是否有一种方法可以重写或修改这段代码,使其只需将一次重定向到url的首选版本?
发布于 2012-12-29 03:58:18
为了解释你想要的,让我们看看你问题中的规则:
.1无法理解这样做的目的:
RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R=301].2问题中的此规则集移除www并将查询字符串?id=val转换为/val,但只有当传入的URI具有www且必须满足这两种条件时才有查询字符串:
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{QUERY_STRING} ^id=([a-z0-9\/-]+)
RewriteRule ^(.*)$ http://example.com/%1? [R=301].3这个规则
RewriteRule ^index.php(.*)$ /$1 [R=301]隐藏index.php,但只在根目录中隐藏。示例:
http://www.example.com/index.php?id=val当它在子目录中时不工作。示例:
http://www.example.com/folder/index.php?id=val.4无法理解这样做的目的:
RewriteRule ^([a-z0-9\/-]+)$ /?id=$1 [L]我建议这样做:
RewriteEngine On
RewriteBase /
#Redirects all www to non-www
RewriteCond %{HTTP_HOST} www\.example\.com$ [NC]
RewriteRule ^(.*)/?$ http://example.com/$1 [R=301,L]
#Hides "index.php" keeping the query if present
RewriteRule ^(.*)/index\.php$ $1/ [R=301,QSA,L]
#Converts query string `?id=val` to `/val`
RewriteCond %{QUERY_STRING} id=([^/]+)
RewriteRule .* /%1? [R=301,L]发布于 2015-09-06 19:56:28
记住,蜘蛛会在几个月后“适应”正确的新结构,这个问题最终可能不会像最初看起来的那么严重。您可以保留所有的.htaccess代码,知道它总是在那里纠正任何“旧的”引用,但实际上几乎不会被实际使用。
在以某种规范形式“修复”URL时,我从来没有找到一种简单的方法来避免多次往返客户端。mod_rewrite似乎更关注于“本地”重定向的情况,即客户端不知道它得到的内容来自一个文件结构,该文件结构与URL所暗示的不完全匹配。
可以在本地保存所有的URL mods,然后只触发一次往返到客户端,通过在新创建的“环境”变量中设置所有的所有URL修改信息,从而一次性传递所有的URL更正,然后在最后询问“有什么变化吗?”然而,这样做是非常冗长和相当尴尬和相当容易出错,从来没有成为一个“推荐的技术”。
https://stackoverflow.com/questions/14075525
复制相似问题