Javascript – apache mod_proxy, configuring ProxyPass & ProxyPassReverse for cross-domain ajax calls

ajaxapachecross-domainjavascript

I'm creating an html5 – JavaScript app (for mobile devices, using PhoneGap). I have to interact with a REST service.

The service is now running on "http://localhost:8080/backend/mvc/"

I'm developing my app on an wamp server (apache2) (http://localhost/stage/)
I'm using Chrome for browser.

when preforming an ajax call the browser responds: XMLHttpRequest cannot load http://localhost:8080/backend/mvc/event. Origin http://localhost is not allowed by Access-Control-Allow-Origin.

So I find several ways to circumvent this cross-domain ajax call problem:

1) starting chrome chrome.exe --disable-web-security
=> no difference

2) configuring apache using mod_proxy to redirect the traffic.

I enabled in the httpd.conf:

proxy_module
proxy_connect_module
proxy_http_module

I put a .htaccess file in the www root with the following content:

# 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]

I restarted all services (apache,php,..)

resulting in error 500

apache error log: [Tue Oct 18 14:30:11 2011] [alert] [client 127.0.0.1] C:/wamp/www/.htaccess: ProxyRequests not allowed here

Any clues on how to resolve this?

Best Answer

I found a working solution:

Enable:

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

Put this in the main section of your configuration (or desired virtual host, if using Apache virtual hosts):

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>

So I guess I can't put it in .htaccess or I had to set ProxyPreserveHost On. I put Include conf/extra/ in the httpd.conf file and created the httpd-proxy.conf file and put the script above in it. Restarted apache and it's working!