Nginx - Leitet alle Anforderungen an ein einzelnes Skript weiter

11

Ich habe ein PHP-Skript, das das Skript-Routing verwaltet und alle möglichen ausgefallenen Dinge erledigt. Es wurde ursprünglich für Apache entwickelt, aber ich versuche, es für einige meiner Boxen auf Nginx zu migrieren. Im Moment versuche ich, Dinge auf einem Testserver zu glätten.

Das Skript funktioniert also so, dass es den gesamten HTTP-Verkehr für das Verzeichnis (in Apache) mithilfe einer .htaccessDatei abfängt . So sieht das aus:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

Ziemlich einfach. Alle Anfragen werden index.phpschlicht und einfach durchlaufen .

Ich möchte dieses Verhalten auf Nginx nachahmen, habe aber noch keinen Weg gefunden. Hat jemand irgendwelche Vorschläge?

Hier ist eine Kopie meiner nginx.confDatei im Moment. Beachten Sie, dass es für mich entwickelt wurde, um nur zu versuchen, es zum Laufen zu bringen. meistens ein Kopier- / Einfügejob.

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}
Mattbasta
quelle

Antworten:

13

Füge das hinzu,

 location / {
                    try_files $uri $uri/ /index.php;
            }

Was es tut, ist, zuerst die Existenz von $ uri und $ uri / als echte Dateien / Ordner zu überprüfen und wenn sie nicht existieren, wird einfach /index.php durchlaufen (das ist mein Setup für das Zend-Framework, bei dem das Routing über den Index erfolgt .php) - Wenn Sie einige Parameter übergeben müssen, fügen Sie einfach am Ende die Datei /index.php a? q = hinzu, und die Parameter werden übergeben.

Stellen Sie sicher, dass die Anweisung try_file ab Version 0.7.27 verfügbar ist.

Adam Benayoun
quelle
7

Ich habe es selbst herausgefunden! Ja!

Alles was ich für den locationBlock brauchte war:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

Alles andere blieb weitgehend gleich.

Mattbasta
quelle
Hast du versucht, was ich unten geschrieben habe? Es bedeutet auch, dass alle Ihre statischen Dateien index.php durchlaufen - nicht sicher, ob Sie das wollen.
Adam Benayoun
@Adam: Ja, ich habe deinen Code ausprobiert. Ich wollte, dass alles durch index.php läuft. Trotzdem danke!
Mattbasta
1

Nachdem Sie das Root-Verzeichnis festgelegt haben, fügen Sie dies hinzu

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

Je nach Bedarf können Sie den regulären Ausdruck ändern, wenn Sie die Regel query_string in index.php festlegen müssen

Zhandos Zhandos Ulanuly
quelle
3
Es gibt bessere Möglichkeiten, als das ifzu erreichen, was er verlangt. wiki.nginx.org/IfIsEvil
Isius
1

Verwenden Sie Folgendes, um GET-Argumente beizubehalten:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

$ is_args wird zu '?' wenn $ args nicht leer ist

Oder noch einfacher:

location / {
    try_files /index.php$is_args$args;
}
Alexander Gavriliuk
quelle
0

Ein sehr wichtiger pitfall vorsichtig zu sein , wenn Ihr Ziel ist eine PHP - Datei ist, zu überprüfen , was return/ rewriteRegel , die Sie verwenden nicht die supercede location ~ \.phpRichtlinie. In diesem Fall stellt nginx Ihre PHP-Datei bereit, ohne sie zu rendern, und zeigt den PHP-Quellcode an. Dies kann katastrophal sein.

Der sicherste Weg ist bereits vorgesehen, location / { try_files $uri $uri/ /index.php; }

Stellen Sie sicher, dass Sie auch index index.phpIhren location /Block festlegen und den location ~ \.phpin der Standardkonfigurationsdatei enthaltenen Block auskommentieren.

Luke Mlsna
quelle