Nginx - Achemine toutes les demandes vers un seul script

11

J'ai un script PHP qui gère le routage des scripts et fait toutes sortes de choses fantaisistes. Il a été initialement conçu pour Apache, mais j'essaie de le migrer vers nginx pour quelques-unes de mes boîtes. En ce moment, j'essaie de lisser les choses sur un serveur de test.

Donc, la façon dont le script fonctionne est qu'il intercepte tout le trafic HTTP pour le répertoire (dans Apache) à l'aide d'un .htaccessfichier. Voici à quoi cela ressemble:

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

Assez simple. Toutes les demandes sont traitées de manière index.phpclaire et simple.

Je cherche à imiter ce comportement sur nginx, mais je n'ai pas encore trouvé de moyen. Quelqu'un a des suggestions?

Voici une copie de mon nginx.confdossier en ce moment. Notez qu'il a été conçu pour moi juste pour essayer de le faire fonctionner; principalement un travail de copier / coller.

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
la source

Réponses:

13

Ajoute ça,

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

Ce qu'il fait, c'est d'abord vérifier l'existence de $ uri et $ uri / en tant que vrais fichiers / dossiers et s'ils n'existent pas, il suffit de passer par /index.php (c'est ma configuration pour le framework Zend où le routage se fait via l'index .php) - bien sûr, si vous avez besoin de passer certains paramètres, ajoutez simplement /index.php a? q = à la fin et il passera les paramètres.

Assurez-vous que la directive try_file est disponible à partir de la version 0.7.27 et au-delà.

Adam Benayoun
la source
Attention: Cela ne fonctionnera pas sur les URL se terminant par .php , par exemple cela fonctionnera/doesNotExist.ph/doesNotExist.php
:,
7

Je l'ai compris moi-même! Ouais!

Tout ce dont j'avais besoin pour le locationbloc était:

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

Tout le reste est resté en grande partie le même.

mattbasta
la source
Avez-vous essayé ce que j'ai écrit ci-dessous? Cela signifie également que tous vos fichiers statiques passeront par index.php - vous n'êtes pas sûr de vouloir cela.
Adam Benayoun
@Adam: oui, j'ai essayé votre code. Je voulais que tout passe par index.php. Merci quand même!
mattbasta
2

Pour conserver les arguments GET, utilisez ce qui suit:

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

$ is_args devient '?' si $ args n'est pas vide

Ou encore plus simple:

location / {
    try_files /index.php$is_args$args;
}
Alexander Gavriliuk
la source
Attention: Cela ne fonctionnera pas sur les URL se terminant par .php , par exemple cela fonctionnera/doesNotExist.ph/doesNotExist.php
:,
1

Après avoir défini le répertoire racine, ajoutez ceci

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

En fonction de vos besoins, vous pouvez modifier l'expression régulière car vous avez besoin de la règle query_string en index.php

Zhandos Zhandos Ulanuly
la source
4
Il y a de meilleures façons que ifd'accomplir ce qu'il demande. wiki.nginx.org/IfIsEvil
Isius
0

Un écueil très important à prendre en compte lorsque votre cible est un fichier PHP est de vous assurer que la return/ rewriterègle que vous utilisez ne remplace pas la location ~ \.phpdirective. Si cela se produit, nginx servira votre fichier PHP sans le rendre, révélant le code source PHP. Cela peut être catastrophique.

Le moyen le plus sûr est déjà fourni, location / { try_files $uri $uri/ /index.php; }

Assurez-vous que vous avez également défini index index.phpvotre location /bloc et décommentez le location ~ \.phpbloc inclus dans le fichier de configuration par défaut.

Luke Mlsna
la source