AJAX, REST Cross-Site-Scripting Sperre
Wer mit AJAX und REST rumspielt/entwickelt steht ab und an vor dem Problem, dass die Cross-Site-Scripting Sperre des Browsers zuschlägt. Es darf nämlich nur von der Adresse nachgeladen werden, von der die Seite an sich auch geladen wird. Macht Sinn im Internet, damit möglich Lücken nicht genutzt werden, ist aber ärgerlich während der Entwicklung. Leider wird der Port der URL auch mit in Betracht gezogen, es reicht also nicht, einen möglicherweise zweiten Server, von dem Daten nachgeladen werden sollen, mit einem anderen Port laufen zu lassen.
Die Lösung ist somit ein Proxy, der auf dem gleichen Server, der die HTML-Seiten ausliefert, läuft. Dieser Proxy leitet die Aufrufe an den Server weiter, der die Daten bereitstellt und gibt die Antwort wieder zurück. Das JavaScript merkt somit nicht, dass die Daten in Wirklichkeit von einer anderen Stelle kommen.
Eine Quick&Dirty Lösung für den Apache aktiviert den Proxy und leitet bestimmte Anfragen per Rewrite um. Dazu wird dem Proxy erlaubt, alles weiterzuleiten:
ProxyRequests On
ProxyVia On<Proxy *>
Order deny,allow
Allow from all
</Proxy>
Danach erstellt man eine RewriteRule zum Beipsiel in der .htaccess oder in der Apache-Config im VirtualHost Bereich:
RewriteEngine on
RewriteRule ^/proxy/(.*) http://SERVERIP:8080/$1 [P,L]
Die Server-IP muss mit der IP oder der Domain vom Server ersetzt werden, von dem die realen Daten kommen. Die 8080 ist als Beispiel für einen Port gegeben. Wenn beim Server keiner angegeben ist, kann der auch hier weggelassen werden. Hiernach sollte alles laufen.
Wenn der Proxy im Apache nicht aktiviert ist, muss das Modul erst noch geladen werden. Bei Ubuntu kann das Proxy Modul folgendermaßen aktiviert und geladen werden:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo /etc/init.d/apache2 force-reload
Viel Spaß damit und dran denken: Die vorgestellt Lösung ist Quick&Dirty und sollte so nicht auf Produktivsystemen und anderen öffentlich erreichbaren Diensten eingesetzt werden, insbesondere weil der Proxy wirklich alles weiterleitet.