In meiner Apache-Konfiguration habe ich die folgende einfache Umschreiberegel welche
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;
}
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;
}
}
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.
Um auch get-Variablen zu übergeben, verwenden Sie $args
:
location / {
try_files $uri $uri/ /index.php?$args;
}
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;
}
Verwenden Sie nginx $ is_args anstelle von? Für GET-Abfragezeichenfolgen
location / { try_files $uri $uri/ /index.php$is_args$args; }
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.
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;
}
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