Wie kann man auf einem Nginx-Server den Zugriff auf einen Ordner mit darin enthaltenen PHP-Dateien für alle blockieren {deny:all;}, ABER Ajax-Aufrufen den Zugriff auf die Dateien in diesem Ordner erlauben?

Wie kann man auf einem Nginx-Server den Zugriff auf einen Ordner mit darin enthaltenen PHP-Dateien für alle blockieren {deny:all;}, ABER Ajax-Aufrufen den Zugriff auf die Dateien in diesem Ordner erlauben?

Ich habe meine Header-, Footer- und anderen PHP-Dateien, die Ajax-Anfragen verarbeiten, in dem /include/Ordner.

Für eine statische Website wird die nginx-Standarddatei auf

location ^~ /include/ { deny all; }

Und als jemand dorthin ging, www.mysite.com/include/header.phpkam ein403 Forbidden

aber jetzt, da ich JQuery-Ajax-Aufrufe an Dateien im /include/Ordner verwende, wenn ich dies einstelle =>

location ^~ /include/ { deny all; }, kein Ajax-Zeug wie Speichern oder Melden funktioniert.

gibt es eine Möglichkeit, wie ichden Zugriff auf die darin enthaltenen Dateien verweigernden /include/Ordner zujeder andereaber mach esnur für die Webroot-Dateien zugänglich?

Ich habe Folgendes ausprobiert:

location ^~ /include/ { allow 127.0.0.1; deny all; }aber das funktioniert nicht.

location ^~ /include/ { allow <my server's ip>; deny all; }aber das funktioniert nicht.

Ich habe den SSH-Port von 22 auf beispielsweise 123 geändert. Soll ich Folgendes eingeben:

location ^~ /include/ { allow 127.0.0.1:123; deny all; }stattdessen?


Habe auch auf ein Tutorial zum Beenden von Hotlinking verwiesen von:http://www.nginxtips.com/how-to-stop-image-hotlinking-on-nginx/

Demnach habe ich versucht,

location ~ .(gif|png|jpe?g)$ {
     valid_referers none blocked mysite.com *.mysite.com;
     if ($invalid_referer) {
     return   403;
    }
}

um das Hotlinking von Bildern zu verhindern (hat wohl nicht funktioniert) und

location /include/ {
     valid_referers none blocked mysite.com *.mysite.com;
     if ($invalid_referer) {
     return   403;
    }
}

um den Zugriff auf den /include/Ordner zu verhindern.

keiner von ihnen hat funktioniert, und ja, ich habe mysite durch den richtigen Namen meiner Website ersetzt

Ich habe auch versucht, Folgendes zu tun:

 location ^~ /include/ {
         valid_referers none blocked mysite.com *.mysite.com;
         if ($invalid_referer) {
         return   403;
        }
    }

Das Hinzufügen führte jedoch ^~dazu, dass die Seite @ www.mysite.com/include/header.php„header.php“ in diesem Fall heruntergeladen wurde, wenn sie im Browser aufgerufen wurde.

Ich verwende keine CMS, sondern nur einfache PHP-Dateien mit CSS und JS, einschließlich der von Bootstap. (nginx 1.4.6, mysql, php5-fpm-Stack)

Alle Vorschläge sind sehr willkommen.

Antwort1

Die AJAX-Aufrufe werden nicht vom Server, sondern vom Browser des Clients durchgeführt. Wenn Sie also nur Ihrem Server Zugriff auf diesen Ordner gewähren, ist das nicht das gewünschte Ergebnis.

Mein Vorschlag wäre, alle per AJAX aufgerufenen Dateien in einen separaten Ordner zu verschieben ( vielleicht) und das, was Sie für den Ordner /ajaxkonfiguriert haben, zu belassen .include

Theoretisch /includesollten die darin enthaltenen Dateien niemals direkt von einem Browser aufgerufen werden, sondern werden wahrscheinlich (stellen Sie sich das vor!) von Ihrer Skriptsprache eingebunden. Aus diesem Grund sollten die per AJAX angeforderten Dateien wahrscheinlich in einem eigenen Ordner abgelegt werden.

Alternativ könnten Sie die AJAX-Anfragen möglicherweise in den /includeOrdner umschreiben, aber ich bin nicht sicher, ob das denyin solchen Fällen anwendbar ist.

Antwort2

Sie können den Zugriff basierend auf dem X-Requested-With: XMLHttpRequestHeader erlauben, den die meisten Javascript-Frameworks ihren AJAX-Anfragen hinzufügen. Beachten Sie jedoch, dass jeder eine solche Anfrage fälschen kann. Sie können nicht sicher sein, dass es sich tatsächlich um eine AJAX-Anfrage handelt, die von Ihrer Webanwendung stammt, und nicht um jemanden, der die AJAX-Anfrage manuell repliziert, indem er curloder ähnliches verwendet.

verwandte Informationen