8 votes

Comment faire pour que Nginx redirige toutes les demandes de fichiers qui n'existent pas vers un seul fichier php ?

J'ai la configuration suivante pour le serveur virtuel nginx :

server {
    listen 80 default_server;

    access_log /path/to/site/dir/logs/access.log;
    error_log /path/to/site/dir/logs/error.log;

    root /path/to/site/dir/webroot;
    index index.php index.html;

    try_files $uri /index.php;

    location ~ \.php$ {
            if (!-f $request_filename) {
                    return 404;
            }

            fastcgi_pass localhost:9000;
            fastcgi_param SCRIPT_FILENAME /path/to/site/dir/webroot$fastcgi_script_name;
            include /path/to/nginx/conf/fastcgi_params;
    }
}

Je veux rediriger toutes les requêtes qui ne correspondent pas à des fichiers existants vers index.php. Cela fonctionne bien pour la plupart des URI pour le moment, par exemple :

example.com/asd
example.com/asd/123/1.txt

Ni l'un ni l'autre asd o asd/123/1.txt existent donc ils sont redirigés vers index.php et cela fonctionne bien. Cependant, si je mets l'url example.com/asd.php il essaie de chercher asd.php et s'il ne le trouve pas, il renvoie 404 au lieu d'envoyer la demande à l'adresse suivante index.php .

Y a-t-il un moyen d'obtenir asd.php à envoyer également à index.php si asd.php n'existe pas ?

12voto

Schotime Points 6067

D'après vos commentaires supplémentaires, il semble que ce soit la meilleure solution, même si la configuration n'est pas très jolie.

server {
    listen 80 default_server;

    access_log /path/to/site/dir/logs/access.log;
    error_log /path/to/site/dir/logs/error.log;

    root /path/to/site/dir/webroot;
    index index.php index.html;

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

    location ~ \.php$ {
        try_files $uri @missing;

        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include /path/to/nginx/conf/fastcgi_params;
    }

    location @missing {
        rewrite ^ /error/404 break;

        fastcgi_pass localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        include /path/to/nginx/conf/fastcgi_params;
    }
}

5voto

Wow, je pense que tout ce que vous voulez pour remplacer ce code est :

error_page 404 /index.php

...si je lis correctement ce que vous voulez.

2voto

Tieme Points 101

Ce que vous essayez de faire est identique à la page d'erreur personnalisée. Vous pouvez utiliser la propriété error_page de nginx pour y parvenir. Suivez le lien pour plus d'informations

http://wiki.nginx.org/HttpCoreModule#error_page

2voto

Trieu Ngo Points 21

Ça a marché avec moi !

    location /anyfolder {
        error_page 404 /yourhandler.php?fnf=$uri;
    }

1voto

danakim Points 410

Je pense que le problème est que vous utilisez "try_files" avec une instruction "if" dans votre emplacement. D'après la documentation, try_files est censé remplacer l'instruction if et le contrôle d'existence du style mod_rewrite. Sur le wiki de nginx, la page "try_files" ( http://wiki.nginx.org/HttpCoreModule#try_files ):

"try_files est essentiellement un remplacement de la vérification de l'existence des fichiers/répertoires typique du style mod_rewrite. Il est censé être plus efficace que l'utilisation de if - voir IfIsEvil".

Consultez la page wiki "if" ( http://wiki.nginx.org/NginxHttpRewriteModule#if ):

"note : Avant d'utiliser if, veuillez consulter la page if is evil et envisagez d'utiliser try_files à la place".

Donc, essayez de supprimer ce contrôle if et de rester avec le "try_files". Cela devrait vérifier l'existence de n'importe quelle page (y compris asd.php ou tout autre fichier se terminant par .php) et revenir à index.php s'il ne la trouve pas.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X