web-dev-qa-db-fra.com

Réécrire toutes les requêtes sur index.php avec nginx

Dans ma configuration Apache, j’ai la règle de réécriture simple suivante.

  1. sauf si le fichier existe va être réécrit sur index.php
  2. sur les urls vous ne voyez jamais l'extension de fichier (.php)

comment puis-je réécrire cela 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 serveur nginx, mais cela 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;
}
48
ptheofan

1 sauf si le fichier existe va être réécrit dans index.php

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

try_files = $uri @missing;

cela va d'abord essayer de servir le fichier et s'il n'est pas trouvé, il passera à la partie @missing. alors ajoutez également les éléments suivants à votre configuration (en dehors du bloc location), cela redirigera vers votre page d’index

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

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

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

et l'exemple de configuration 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 "/$1.php";
        rewrite ^/([a-z]+)$ /$1.php last;
    }
}
34
jagsler

Solution parfaite, j'ai essayé et réussi à obtenir ma page d'index quand j'ai ajouté ce code dans le fichier de configuration de mon site.

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

Dans le fichier de configuration lui-même a expliqué qu'à la "Première tentative de servir la demande en tant que fichier, puis en tant que répertoire, puis revenir à index.html, dans mon cas, il s'agit de index.php car je fournis une page via du code php.

98
Sanju D

Pour transmettre également les variables, utilisez $args:

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

Une 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
iutinvg

Utiliser nginx $ is_args au lieu de? Pour les chaînes de requête GET

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

Voici ce qui a fonctionné pour moi pour résoudre la partie 1 de cette question:

    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;
    }

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

try_files $ uri $ uri// index.php = 404; est emprunté à la réponse de SanjuD, mais avec une redirection supplémentaire de 404 si 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 été redirigé vers le fichier index.php sans cette ligne.

1
Brett Pennings

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

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


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

Voici la réponse de votre 2ème question:

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

c'est un travail pour moi (basé sur mon expérience), cela signifie que tout votre blabla.php sera réécrit dans blabla

comme http://votresiteweb.com/index.php à http://votresiteweb.com/index

0
Ariq Naufal