Réécriture des try_files de nginx

8

J'essaie de convertir une réécriture très simple d'une version précédente de nginx vers la version actuelle, comme ci-dessous:

location / {
   if ( !-f $request_filename ) {
     rewrite ^/([a-z]*)$ /index.php?action=$1;
     rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2;
   }
}

Voilà jusqu'où je suis allé. La page d'index apparaît, mais toute page qui devrait être réécrite comme ci-dessus, jette à la place des 404:

server {

    listen 80 default;
    root /var/www;
    index index.php;
    server_name _;

    location / {
        try_files $uri $uri/ /index.php?action=$uri&item=$args;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Qu'est-ce que je fais mal ici?

Industriel
la source
Que se passe-t-il exactement? Une partie du problème est $ uri et $ args ne sont pas correctement encodés.
Luke
404 est jeté avec File not found. si j'utilise l'URI /pageou/page/id
Industrial
Que se passe-t-il quand tu fais juste try_files $uri $uri/ /index.php?
Luke
Index.php fonctionne bien, mais tout ce qui devrait être réécrit finit dans les années 404
Industrial
Essayez try_files $uri $uri/ /index.php?$args. Vous devriez pouvoir obtenir l'URL avec $_SERVER['REQUEST_URI']. $ _GET devrait fonctionner normalement.
Luke

Réponses:

9

Cela devrait fonctionner:

location / { 
    try_files $uri $uri/ @rules; 
} 

location @rules { 
    rewrite ^/([a-z]*)$ /index.php?action=$1; 
    rewrite ^/([a-z]*)/(.*)$ /index.php?action=$1&item=$2; 
}

location /index.php { 
    fastcgi_pass 127.0.0.1:9000; 
    include fastcgi_params; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
}
Luc
la source
Hmm. Dans votre premier exemple, index.php se chargera, mais tous les fichiers statiques ou demandes d'URI tels que /page1/itemrenverront index.php
Industrial
C'est étrange. try_files devrait s'en occuper.
Luke
J'ai également essayé le deuxième exemple. Même problème là
Industrial
Je suppose que cela try_files $uri $uri/fonctionne avec des fichiers statiques?
Luke