2011-07-12 21 views
0

我对这个问题的答案肯定是90%,但我想积极:mod_rewrite - Apache的内部或基于重定向?

默认情况下(例如不使用301修饰符),在Apache内部mod_rewrite内部路径或重定向客户端通过http头或其他方法?

我所有的直觉,研究和经验都表明重定向是在内部完成的。通过“内部”,我的意思是客户端忘记了mod_rewrite正在使用的事实。例如,考虑下面的规则:

RewriteRule ^([^/]+)$ dispatcher.html?cat=$1 

当做出请求时此规则适用(例如example.com/testing),该请求被重定向(例如,为了example.com/dispatcher.html?cat=testing)。我对mod_rewrite的理解是模块简单地重写请求,看起来原来的请求来自example.com/dispatcher.html?cat=testing

这是正确的吗?

回答

4

默认情况下(例如不使用301修饰符),Apache内部mod_rewrite内部路径或通过http头或其他方法重定向客户端?

您显示的示例将在内部重写。

如果您明确强制使用完整的URL,那么除了(如果我读取docs右侧),完整的URL指向与当前正在处理的域相同的域时将发生标头重定向,在这种情况下,指定服务器的部分将被剥离,并执行内部重定向。

此列表从文档显示了所有可能的方案:

Given Rule          Resulting Substitution 
---------------------------------------------- ---------------------------------- 
^/somepath(.*) otherpath$1      invalid, not supported 

^/somepath(.*) otherpath$1 [R]     invalid, not supported 

^/somepath(.*) otherpath$1 [P]     invalid, not supported 
---------------------------------------------- ---------------------------------- 
^/somepath(.*) /otherpath$1      /otherpath/pathinfo 

^/somepath(.*) /otherpath$1 [R]     http://thishost/otherpath/pathinfo 
               via external redirection 

^/somepath(.*) /otherpath$1 [P]     doesn't make sense, not supported 
---------------------------------------------- ---------------------------------- 
^/somepath(.*) http://thishost/otherpath$1  /otherpath/pathinfo 

^/somepath(.*) http://thishost/otherpath$1 [R] http://thishost/otherpath/pathinfo 
               via external redirection 

^/somepath(.*) http://thishost/otherpath$1 [P] doesn't make sense, not supported 
---------------------------------------------- ---------------------------------- 
^/somepath(.*) http://otherhost/otherpath$1  http://otherhost/otherpath/pathinfo 
               via external redirection 

^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo 
               via external redirection 
               (the [R] flag is redundant) 

^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo 
               via internal proxy 
+0

正是我的预期。令人惊讶的是,在今天上午我所做的所有(很简短)的研究中,没有人花时间明确描述mod_rewrite是如何工作的! :)谢谢,佩卡! – rinogo

+0

你发布的最后一个例子很有趣!如果得出这样的结论:是否会导致mod_rewrite执行自己的http:// otherhost/otherpath $ 1的请求并将其返回给客户端?迷人。我不知道mod_rewrite可以做到这一点! :) – rinogo