Umschreiben der try_files von nginx

8

Ich versuche, ein sehr einfaches Umschreiben von einer früheren Nginx-Version in die aktuelle Version zu konvertieren, die wie folgt aussieht:

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

So weit bin ich gekommen. Die Indexseite wird angezeigt, aber jede Seite, die wie oben beschrieben umgeschrieben werden sollte, wirft stattdessen 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;
    }
}

Was mache ich hier falsch?

Industriell
quelle
Was genau passiert? Ein Teil des Problems ist $ uri und $ args sind nicht richtig codiert.
Luke
404 wird mit geworfen, File not found. wenn ich entweder URI /pageoder/page/id
Industrial
Was passiert, wenn Sie gerade tun try_files $uri $uri/ /index.php?
Luke
Index.php funktioniert gut, aber alles, was umgeschrieben werden sollte, endet in 404
Industrial
Versuchen Sie es try_files $uri $uri/ /index.php?$args. Sie sollten in der Lage sein, die URL mit zu erhalten $_SERVER['REQUEST_URI']. $ _GET sollte normal funktionieren.
Luke

Antworten:

9

Das sollte funktionieren:

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; 
}
Luke
quelle
Hmm. In Ihrem ersten Beispiel wird index.php geladen, aber alle statischen Dateien oder URI-Anforderungen, wie z. B. /page1/itemdie index.php
Industrial
Das ist seltsam. try_files sollte sich darum kümmern.
Luke
Versuchte auch das zweite Beispiel. Gleiche Ausgabe dort
Industrial
Ich gehe davon aus, dass try_files $uri $uri/mit statischen Dateien funktioniert?
Luke
1
Lassen Sie uns diese Diskussion im Chat fortsetzen
Luke