web-dev-qa-db-fra.com

Comment supprimer les extensions .php et .html de l'URL avec NGINX?

Je veux que mon nginx fasse afficher toutes les URLs propres. 

Avec quelques recherches, j'ai fait le premier cas au travail. C'est fait en suivant la configuration:

location / {
    root   html;
    index  index.html index.htm index.php;
    try_files $uri.html $uri/ =404; 
}

Cela fonctionne pour indexhtml.html qui s’affiche sous la forme indexhtml, mais rien ne se passe avec .php. Si je change $ uri.html en $ uri.php, cela ne fonctionne ni pour .html, ni .php. J'ai essayé de mettre quelque chose de similaire dans l'emplacement php mais sans aucun succès.

Des conseils?

34
anthropophagus

D'après mes recherches, si vous ajoutez votre fichier /etc/nginx/conf.d/domain.tld.conf à inclure:

location / {
    try_files $uri $uri.html $uri/ @extensionless-php;
    index index.html index.htm index.php;
}

location ~ \.php$ {
    try_files $uri =404;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

Ensuite, redémarrez nginx et essayez-le. J'espère que cela vous aidera! Plus d'informations peuvent être trouvées (où je les ai trouvées) ici @ tweaktalk.net

39
Jack

Pas besoin de blocs supplémentaires et d'emplacements nommés et tout. Déplacer également la ligne indexen dehors du bloc de localisation

server {
  index index.html index.php;
  location / {
    try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}

Gardez à l'esprit que si vous avez un dossier et un fichier portant le même nom dans le même dossier, comme /folder/xyz/ et /folder/xyz.php, vous ne pourrez pas exécuter le fichier php si le dossier xyz contient un index.php ou index.html, conservez simplement ceci dans esprit.

41
Mohammad AbuShady

Pour approfondir la réponse de Mohammad , vous pouvez également proposer des redirections de .html et .php vers les versions sans extension.

Cela peut être accompli du fait que $request_uri contient "l'URI de la requête d'origine complète (avec arguments)" et qu'il n'est pas affecté par les réécritures internes non visibles par l'utilisateur.

server {
  index index.html index.php;
  location / {
    if ($request_uri ~ ^/(.*)\.html$) {  return 302 /$1;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
  }
  location ~ \.php$ {
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /$1?$args;  }
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}
8
cnst

Peut-être cela peut-il vous être utile… C'est simple et le travail est fait:

location / {
  rewrite ^/([^\.]+)$ /$1.html break;
}
0
Łukasz Pniewski