I setup Nginx PHP-FPM, with Centos 7, and Virtualmin control panel. I want to have all pages a SEO Friendly link without .php.
System automatically create configuration : etc/nginx/nginx.conf
And empty folder: 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; } }
I found many information include the code below makes url working without .php But after applying that, the page just shown 404 not found page.
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; }
My question is, where should I insert the code above? what is completed code so it will work. May be I miss some parameter. If I must create a .conf file in etc/nginx/conf.d/
what is the complete code that i must put in the conf file?
Any help is much appreciated. (please note that My.Domain.IP.Address
is replace with an IP address, and mydomain is a website domain name.).
Advertisement
Answer
My question is, where should I insert the code above?
The server
block for your domain contains one location
block. The other two location
blocks need to be added to that same server
block.
For example:
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; } ... }
But conflicting server name error still exist. What is the solution?
Use nginx -T
(that’s an uppercase T
) to test the Nginx configuration file and view the entire configuration across all the included files. Inspect the server_name
directives and identify where the duplicated name is coming from.
Just because your distribution includes include
directives and directories to help organise your configuration across multiple files, you do not need to use them. Keeping the entire configuration in a single nginx.conf
can be convenient for simpler servers.