apache mod_proxy,配置ProxyPass& ProxyPassReverse用于跨域ajax调用

时间:2011-10-18 13:01:58

标签: javascript ajax apache cross-domain

我正在创建一个html5 - JavaScript应用程序(适用于移动设备,使用PhoneGap)。我必须与REST服务进行交互。

该服务现在正在"http://localhost:8080/backend/mvc/"

上运行

我正在wamp服务器上开发我的应用程序(apache2)(http://localhost/stage/) 我正在使用Chrome浏览器。

在执行ajax调用时,浏览器会响应:{​​{1}}

所以我找到了几种方法来规避这种跨域的ajax调用问题:

1)启动chrome XMLHttpRequest cannot load http://localhost:8080/backend/mvc/event. Origin http://localhost is not allowed by Access-Control-Allow-Origin.  =>没有区别

2)使用mod_proxy配置apache以重定向流量。

我在httpd.conf中启用了:

chrome.exe --disable-web-security

我在www根目录中放了一个proxy_module proxy_connect_module proxy_http_module 文件,其中包含以下内容:

.htaccess

我重启了所有服务(apache,php,..)

导致错误500

apache错误日志:# start mod_rewrite RewriteEngine On ProxyRequests off <Proxy> Order deny,allow Allow from all </Proxy> ProxyPass /EMBackend/ http://localhost:8080/backend/mvc/ ProxyPassReverse /EMBackend/ http://localhost:8080/backend/mvc/ RewriteRule ^/EMBackend/(.*)$ /backend/mvc/$1 [R]

有关如何解决此问题的任何线索?

3 个答案:

答案 0 :(得分:24)

我找到了一个有效的解决方案:

启用:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

将其放在配置的主要部分(如果使用Apache虚拟主机,则为所需的虚拟主机):

ProxyRequests Off
ProxyPreserveHost On

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

ProxyPass /EMBackend http://localhost:8080/backend/mvc
ProxyPassReverse /EMBackend http://localhost:8080/backend/mvc
<Location /EMBackend>
    Order allow,deny
    Allow from all
</Location>

所以我想我不能把它放在.htaccess中,或者我必须设置ProxyPreserveHost On。我将Include conf/extra/放在httpd.conf文件中并创建了httpd-proxy.conf文件并将上面的脚本放入其中。重新启动了apache,它正在运行!

答案 1 :(得分:2)

启用代理模块后,您只需在 httpd.conf 中添加给定的行。

ProxyPreserveHost On
ProxyPass /EMBackend http://localhost:8080/backend/mvc
ProxyPassReverse /EMBackend http://localhost:8080/backend/mvc

只需重新启动服务器即可完成。

答案 2 :(得分:2)

在非常现代的apache中,通过以下方式启用代理:

a2enmod proxy;
a2enmod proxy_http