首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mod_rewrite避免链重定向?

如何使用mod_rewrite避免链重定向?
EN

Stack Overflow用户
提问于 2012-12-28 20:40:22
回答 2查看 835关注 0票数 2

简单地说,我是在我的网站上工作,以使搜索引擎优化友好。我想做到以下几点:

  • 将urls重写为漂亮的urls
  • 去掉多个斜线(如。example.com/////something///example.com/something/
  • 将www版本重定向为非www版本。
  • 从所有urls隐藏index.php文件
  • 从旧的重定向(/?id=something/到新的urls /something/)

我想出了一个.htaccess代码:

代码语言:javascript
复制
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的首选版本?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-29 03:58:18

为了解释你想要的,让我们看看你问题中的规则:

.1无法理解这样做的目的:

代码语言:javascript
复制
RewriteCond %{THE_REQUEST} //
RewriteRule .* $0 [R=301]

.2问题中的此规则集移除www并将查询字符串?id=val转换为/val,但只有当传入的URI具有www且必须满足这两种条件时才有查询字符串:

代码语言:javascript
复制
RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]
RewriteCond %{QUERY_STRING} ^id=([a-z0-9\/-]+)
RewriteRule ^(.*)$ http://example.com/%1? [R=301]

.3这个规则

代码语言:javascript
复制
RewriteRule ^index.php(.*)$ /$1 [R=301]

隐藏index.php,但只在根目录中隐藏。示例:

代码语言:javascript
复制
http://www.example.com/index.php?id=val

当它在子目录中时不工作。示例:

代码语言:javascript
复制
http://www.example.com/folder/index.php?id=val

.4无法理解这样做的目的:

代码语言:javascript
复制
RewriteRule ^([a-z0-9\/-]+)$ /?id=$1 [L]

我建议这样做:

代码语言:javascript
复制
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]
票数 1
EN

Stack Overflow用户

发布于 2015-09-06 19:56:28

记住,蜘蛛会在几个月后“适应”正确的新结构,这个问题最终可能不会像最初看起来的那么严重。您可以保留所有的.htaccess代码,知道它总是在那里纠正任何“旧的”引用,但实际上几乎不会被实际使用。

在以某种规范形式“修复”URL时,我从来没有找到一种简单的方法来避免多次往返客户端。mod_rewrite似乎更关注于“本地”重定向的情况,即客户端不知道它得到的内容来自一个文件结构,该文件结构与URL所暗示的不完全匹配。

可以在本地保存所有的URL mods,然后只触发一次往返到客户端,通过在新创建的“环境”变量中设置所有的所有URL修改信息,从而一次性传递所有的URL更正,然后在最后询问“有什么变化吗?”然而,这样做是非常冗长和相当尴尬和相当容易出错,从来没有成为一个“推荐的技术”。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14075525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档