it-swarm.com.de

Schreiben Sie alle Anforderungen in index.php mit nginx um

In meiner Apache-Konfiguration habe ich die folgende einfache Umschreiberegel welche

  1. wenn die Datei nicht vorhanden ist, wird sie in index.php geschrieben
  2. auf den URLs sehen Sie niemals die Dateierweiterung (.php)

wie kann ich das in nginx umschreiben?

#
# Redirect all to index.php
#
RewriteEngine On

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} (/[^.]*|\.)$ [NC]
RewriteRule .* index.php [L]

So sieht mein nginx-Serverblock jetzt aus, funktioniert aber nicht :(

root /home/user/www;
index index.php;

# Make site accessible from http://localhost/
server_name some-domain.dev;


###############################################################
# exclude /favicon.ico from logs
location = /favicon.ico {
    log_not_found off;
    access_log off;
}   

##############################################################
# Disable logging for robots.txt
location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}   

##############################################################
# Deny all attempts to access hidden files such as 
# .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}   

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

###############################################################
# serve static files directly
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
    access_log off;
    expires    30d;
}   

###############################################################
# redirect server error pages to the static page /50x.html
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root html;
}   

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#   
location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    # With php5-cgi alone:
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}
48
ptheofan

1, sofern keine Datei vorhanden ist, wird in index.php umgeschrieben.

Fügen Sie Ihrem location ~ \.php$ Folgendes hinzu:

try_files = $uri @missing;

dies wird zuerst versuchen, die Datei bereitzustellen, und wenn sie nicht gefunden wird, wird sie in den @missing-Teil verschoben. Fügen Sie der config (außerhalb des location-Blocks) also Folgendes hinzu, um auf Ihre Indexseite umzuleiten

location @missing {
    rewrite ^ $scheme://$Host/index.php permanent;
}

2 in den URLs sehen Sie niemals die Dateierweiterung (.php)

um die PHP-Erweiterung zu entfernen, lesen Sie Folgendes: http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/

und die Beispielkonfiguration aus dem Link:

location / {
    set $page_to_view "/index.php";
    try_files $uri $uri/ @rewrites;
    root   /var/www/site;
    index  index.php index.html index.htm;
}

location ~ \.php$ {
    include /etc/nginx/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/site$page_to_view;
}

# rewrites
location @rewrites {
    if ($uri ~* ^/([a-z]+)$) {
        set $page_to_view "/$1.php";
        rewrite ^/([a-z]+)$ /$1.php last;
    }
}
34
jagsler

Perfekte Lösung Ich habe es ausprobiert und kann meine Indexseite abrufen, wenn ich diesen Code in meine Site-Konfigurationsdatei angehängt habe.

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

In der Konfigurationsdatei selbst erklärt, dass bei "Zuerst versuchen, Anfrage als Datei zu liefern, dann als Verzeichnis, dann auf index.html zurückgreifen. In meinem Fall handelt es sich um index.php, da ich Seite durch PHP-Code bereitstelle.

98
Sanju D

Um auch get-Variablen zu übergeben, verwenden Sie $args:

location / {
    try_files $uri $uri/ /index.php?$args;
}
54
Jan Wy

Flache und einfache Konfiguration ohne Umschreiben, kann in einigen Fällen funktionieren:

location / {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php;
}
15
iutinvg

Verwenden Sie nginx $ is_args anstelle von? Für GET-Abfragezeichenfolgen

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

Was für mich funktioniert hat, um Teil 1 dieser Frage zu lösen:

    location / {
            rewrite ^([^.]*[^/])$ $1/ permanent;
            try_files $uri $uri/ /index.php =404;
            include fastcgi_params;
            fastcgi_pass php5-fpm-sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_intercept_errors on;
    }

umschreiben ^ ([^.] * [^ /]) $ $ 1/permanent; schreibt Adressen, die keine Dateien sind (Adressen ohne Dateierweiterung), so, dass am Ende ein "/" angezeigt wird. Ich habe dies getan, weil ich auf "Zugriff verweigert" gestoßen bin. Nachricht, wenn ich versucht habe, auf den Ordner zuzugreifen.

try_files $ uri $ uri//index.php = 404; ist der Antwort von SanjuD entlehnt, jedoch mit einer zusätzlichen 404-Weiterleitung, falls der Standort noch nicht gefunden wurde.

fastcgi_index index.php; war das letzte Stück des Puzzles, das ich vermisst habe. Der Ordner wurde nicht ohne diese Zeile zur index.php umgeleitet.

1
Brett Pennings

Wenn Sie nur die index.php (keine andere PHP-Datei wird an fastcgi übergeben werden) an fastcgi übergeben wollen, falls Sie solche Routen in einem Framework wie Codeigniter haben 

$route["/download.php"] = "controller/method";


location ~ index\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
}
0
Sajjad Ashraf

Hier ist die Antwort auf Ihre zweite Frage:

   location / {
        rewrite ^/(.*)$ /$1.php last;
}

es ist Arbeit für mich (basierend auf meiner Erfahrung), bedeutet, dass alle Ihre blabla.php in blabla umgeschrieben werden

wie http://yourwebsite.com/index.php bis http://yourwebsite.com/index

0
Ariq Naufal