2 votes

URL Rewrite pour supprimer .php dans mon Nginx PHP-FPM

J'ai installé Nginx PHP-FPM, avec Centos 7, et le panneau de contrôle Virtualmin. Je souhaite que toutes les pages aient un lien SEO Friendly sans .php.

Le système crée automatiquement la configuration : etc/nginx/nginx.conf

Et un dossier vide : etc/nginx/conf.d/

nginx.conf :

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
          include /etc/nginx/default.d/*.conf;

           location / {
           }

        #error_page 404 /404.html;
           location = /40x.html{
       }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }         
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

    server_names_hash_bucket_size 128;
    server {
        server_name mydomain.com www.mydomain.com;
        listen My.Domain.IP.Address;
        root /home/mydomain/public_html;
        index index.html index.htm index.php;        
        access_log /var/log/virtualmin/mydomain.com_access_log;
        error_log /var/log/virtualmin/mydomain.com_error_log;       
        fastcgi_param GATEWAY_INTERFACE CGI/1.1;
        fastcgi_param SERVER_SOFTWARE nginx;
        fastcgi_param QUERY_STRING $query_string;
        fastcgi_param REQUEST_METHOD $request_method;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_param SCRIPT_FILENAME /home/mydomain/public_html$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param REQUEST_URI $request_uri;
        fastcgi_param DOCUMENT_URI $document_uri;
        fastcgi_param DOCUMENT_ROOT /home/mydomain/public_html;
        fastcgi_param SERVER_PROTOCOL $server_protocol;
        fastcgi_param REMOTE_ADDR $remote_addr;
        fastcgi_param REMOTE_PORT $remote_port;
        fastcgi_param SERVER_ADDR $server_addr;
        fastcgi_param SERVER_PORT $server_port;
        fastcgi_param SERVER_NAME $server_name;
        fastcgi_param HTTPS $https;
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass localhost:8000;
        }
        listen My.Domain.IP.Address:443 default ssl;
        ssl_certificate /home/mydomain/ssl.combined;
        ssl_certificate_key /home/mydomain/ssl.key;
        fastcgi_read_timeout 30;

    }

}

J'ai trouvé de nombreuses informations dont le code ci-dessous qui fait fonctionner l'url sans .php Mais après avoir appliqué ce code, la page affiche 404 non trouvé.

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

Ma question est la suivante : où dois-je insérer le code ci-dessus ? quel est le code complet pour que cela fonctionne. Il se peut qu'il me manque un paramètre. Si je dois créer un fichier .conf dans etc/nginx/conf.d/ Quel est le code complet que je dois mettre dans le fichier conf ?

Toute aide est la bienvenue. (veuillez noter que My.Domain.IP.Address est remplacé par une adresse IP, et mydomain est un nom de domaine de site web).

0voto

Richard Smith Points 17777

Ma question est la suivante : où dois-je insérer le code ci-dessus ?

En server pour votre domaine contient un location bloc. Les deux autres location doivent être ajoutés à ce même server bloc.

Par exemple :

server {
    server_name example.com www.example.com;
    root /home/mydomain/public_html;

    ...

    location / {
        try_files $uri $uri.html $uri/ @extensionless-php;
        index index.html index.htm index.php;
    }    
    location @extensionless-php {
        rewrite ^ $1.php last;
    }
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass localhost:8000;
    }

    ...
}

Mais l'erreur de conflit de nom de serveur persiste. Quelle est la solution ?

Utilisation nginx -T (c'est une majuscule T ) pour tester le fichier de configuration de Nginx et visualiser l'ensemble de la configuration de tous les fichiers inclus. Inspecter les server_name et d'identifier l'origine du nom dupliqué.

Ce n'est pas parce que votre distribution comprend include pour vous aider à organiser votre configuration dans plusieurs fichiers, vous n'avez pas besoin de les utiliser. Le fait de conserver l'ensemble de la configuration dans un seul fichier nginx.conf peut être pratique pour les serveurs plus simples.

0voto

PauloBoaventura Points 53

Bonjour, apportez les modifications suivantes

de votre code :

@extensionless-php;

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

.php$ {

0voto

PauloBoaventura Points 53
server {
server_name example.com www.example.com;
root /home/mydomain/public_html;

...
location / {
            # This is cool because no php is touched for static content.
            # include the "?$args" part so non-default permalinks doesn't 
break when using query string
            try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass localhost:8000;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X