mod_rewrite - Apache内部,还是基于重定向?

时间:2011-07-12 17:51:16

标签: apache mod-rewrite

我90%肯定这个问题的答案,但我想要肯定:

默认情况下(例如,不使用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

这是对的吗?

1 个答案:

答案 0 :(得分:4)

  

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

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

如果您明确强制使用完整网址,则会发生标头重定向,除非(如果我读取docs权限),如果完整网址指向与当前正在处理的域相同的域,则在这种情况下,该部分指定服务器将被剥离,并执行内部重定向。

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

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