2010-11-07 60 views
1

我有一个Apache 2.2,我使用mod_rewrite。我的目标是将流量从 http://localhost:80/AA转发到http://localhost:8090/BB。所以我有一个简单的规则mod_rewrite返回302找到

重写规则http://localhost:80/AA的http://本地主机:8090/BB

我的问题是客户端收到 “302找到”。我希望RewriteRule将 转发从AA到BB的流量,最后BB会将响应发送给我的客户端。

我的配置有问题吗?

+0

我假设有在游戏中无论是两个不同的Web服务器在这里,'一个聆听80'和'8090'一个聆听,或你有2个不同的VirtualHosts在这2个端口上监听Apache吗? – 2010-11-07 15:12:12

+0

一个tomcat服务器位于http:// localhost:8090/BB。不过,我不想告诉我的客户更改网址。所以我安装了apache以使用mod_rewrite功能,并从端口80 t0 8090发送流量。我不知道这是否是最佳解决方案... – cateof 2010-11-07 15:21:09

+1

我想我对您的问题感到困惑。当你使用mod_rewrite从一台主机重定向到另一台主机时,你*会得到两个发送到浏览器的响应。第一个是302,它告诉浏览器转到第二个URL。第二个响应应该是200.除了响应代码之外,重定向是否工作? – bmb 2010-11-07 16:35:35

回答

0

RewriteRule的左侧或图案应该只是要匹配的文件名,例如, ^/AA$。如果您还想确保主机和端口匹配特定值,则应设置RewriteCond匹配%{HTTP_HOST}%{SERVER_PORT}。但是后者可能是不必要的,除非您的Web服务器配置了多个域和端口。

这是未经测试,但这样的事情:

RewriteCond %{HTTP_HOST} ^localhost 
RewriteCond %{SERVER_PORT} ^80$ 
RewriteRule ^/AA$   http://localhost:8090/BB 

我建议你尝试就这第一:

RewriteRule ^/AA$   http://localhost:8090/BB 

,如果你需要他们添加的RewriteCond的。

根据意见编辑:如果您尝试避免“302”响应,则无法为您描述的情况做到这一点。当你使用mod_rewrite从一台主机重定向到另一台时,你会得到两个发送到浏览器的响应。第一个是302,它告诉浏览器转到第二个URL。第二个响应应该是200.

使用mod_rewrite时,如果在相同的服务器和端口上重写从一个页面到另一个页面,则可以避免中间的重定向。在这种情况下,重写是内部的,即使请求是针对AA,Web服务器也可以用BB页面进行响应。如果使用不同的服务器或端口,AA的Web服务器无法访问页面BB,因此它会将重定向响应为有权访问的服务器。

如果您可以重新配置站点以使用AA和BB的相同端口,则可以使其工作。如果没有,我认为你可以用mod_proxy做你想做的事。我从来没有使用mod_proxy,所以我不知道你需要做什么。

+0

我只用了你的RewriteRule,并在行尾添加了[R = permanent,L]。结果是将错误301发送回客户端。我想要的是从AA转发到BB的规则,然后服务器在8090处将向我的客户端发送http 200 OK – cateof 2010-11-07 16:07:02

+1

在8090处的BB页面是否已成功显示?如果是这样,那么它工作。 :80发送301或302重定向,然后8090发送200.使用mod_rewrite从一台服务器重定向到另一台服务器时,您无法避开中间的301。 – bmb 2010-11-07 16:38:28

+0

mod_proxy的问题在于,您不能在替换URL中使用问号字符。例如foo.example.com/bar?lala会发出抱怨,因为?lala被视为查询字符串。这是mod_proxy - cateof 0秒前的问题 – cateof 2010-11-09 16:24:55

1

RewriteRule

的文档你想做的事是R标志添加到您的规则,重定向。

RewriteRule http://localhost:80/AA http://localhost:8090/BB [R=permanent,L] 

L为最后的规则。

+0

我不工作。我现在返回错误404 – cateof 2010-11-07 15:30:42

+0

你检查了返回的头文件吗?例如。在Firefox中使用Firebug(或其他浏览器中的类似内容)在Net选项卡中。检查返回的标题(位置和HTTP状态码)。那么,它是否将你重定向到404,还是在第一个请求的页面上返回404? – Kissaki 2010-11-07 21:00:14

0

如果您希望转发流量,我猜0123'不能这样做。你最好使用mod_proxyhttp://httpd.apache.org/docs/2.0/mod/mod_proxy.html#proxypassreverse

来自实例文档:

ProxyRequests Off 

<Proxy *> 
    Order deny,allow 
    Allow from all 
</Proxy> 

ProxyPass /foo http://foo.example.com/bar 
ProxyPassReverse /foo http://foo.example.com/bar 
+0

mod_proxy的问题是您不能在替换URL中使用问号字符。例如http://foo.example.com/bar?lala会投诉,因为?lala被视为查询字符串。这就是mod_proxy的问题 – cateof 2010-11-09 16:24:24

+0

与Apache文档中的ProxyPass指令一样:_如果您需要更灵活的反向代理配置,请参阅带有[P]标志_的RewriteRule指令。所以试着在你的RewriteRule之后设置[P]标志,这会省略302 Found响应代码。 – kolyaseg 2016-06-28 08:04:42