Réécrivez toutes les requêtes vers index.php avec nginx

dans ma configuration apache j'ai la règle de réécriture simple suivante qui

  1. à moins que le fichier existe va réécrire en index.php
  2. sur les urls vous ne voyez jamais l'extension de fichier (.php)

Comment puis-je réécrire ceci dans nginx?

#
# 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]

voici à quoi ressemble mon bloc de serveur nginx maintenant, mais il ne fonctionne pas: (

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;
}
43
demandé sur ptheofan 2012-10-17 03:17:59

8 réponses

1 à moins que le fichier existe va réécrire en index.php

ajouter ce qui suit à votre location ~ \.php$

try_files = $uri @missing;

ceci va d'abord essayer de servir le fichier et s'il n'est pas trouvé il va passer à @missing partie. ajoutez donc aussi ce qui suit à votre configuration (en dehors de location block), cela redirigera vers votre page d'index

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

2 sur les urls vous ne voyez jamais l'extension de fichier (.php)

supprimer l'extension php lire ce qui suit: http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/

et la configuration de l'exemple à partir du lien:

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 "/.php";
        rewrite ^/([a-z]+)$ /.php last;
    }
}
31
répondu jagsler 2012-10-17 16:43:14

solution parfaite j'ai essayé et j'ai réussi à obtenir ma page d'index lorsque j'ai ajouté ce code dans mon fichier de configuration du site.

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

dans le fichier de configuration lui-même a expliqué qu'à "D'abord essayer de servir la requête en tant que Fichier, puis en tant que répertoire, puis retomber dans index.html dans mon cas, c'est l'index.php que je suis en fournissant page sur le code php.

94
répondu Sanju D 2014-03-13 07:49:04

Pour passer à obtenir des variables aussi bien utiliser $args:

location / {
    try_files $uri $uri/ /index.php?$args;
}
51
répondu Jan Wy 2014-02-12 15:15:16

configuration simple et plate sans réécriture, peut fonctionner dans certains cas:

location / {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php;
}
15
répondu iutinvg 2013-06-06 11:41:30

en utilisant nginx $is_args au lieu de ? Pour obtenir des chaînes de requête

location / { try_files $uri $uri/ /index.php$is_args$args; }
2
répondu razzbee 2016-11-23 18:11:01

voici ce qui a fonctionné pour moi pour résoudre la première partie de cette question:

    location / {
            rewrite ^([^.]*[^/])$ / 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;
    }

réécrire ^([^.]*[^/])$ $1/ permanent; réécrit les adresses non-fichier (adresses sans extension de fichier) pour avoir un "/" à la fin. J'ai fait ça parce que je tombais sur "Accès refusé"."message quand j'ai essayé d'accéder au dossier sans elle.

try_files $uri $uri/ /index.php =404; est emprunté à la réponse de SanjuD, mais avec un supplément de 404 réacheminement si le l'emplacement n'est toujours pas trouvé.

fastcgi_index index.php; était la dernière pièce du puzzle qui me manquait. Le dossier n'a pas rediriger vers l'index.php sans cette ligne.

1
répondu Brett Pennings 2013-11-12 21:12:56

Si vous voulez passer juste l'index.php (aucun autre fichier php ne sera passé à fastcgi ) à fastcgi au cas où vous auriez des routes comme celle-ci dans un framework comme codeigniter

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


location ~ index\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
}
0
répondu Sajjad Ashraf 2015-02-12 19:18:00

Voici la réponse à votre 2e question:

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

c'est un travail pour moi (selon mon expérience), signifie que tout votre blabla.php va se réécrire en blabla

http://yourwebsite.com/index.phphttp://yourwebsite.com/index

0
répondu Ariq Naufal 2016-04-20 14:16:57