Как удалить оба .php и .html расширения из url с помощью NGINX?

Я хочу, чтобы мой nginx отображал все URL-адреса.

  • http://www.mydomain.com/indexhtml.html как http://www.mydomain.com/indexhtml
  • http://www.mydomain.com/indexphp.php как http://www.mydomain.com/indexphp

С некоторыми исследованиями я сделал первый случай для работы. Это делается по следующей конфигурации:

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

Он работает для отображения indexhtml.html как indexhtml, но ничего не происходит с .php. Если я изменил $ uri.html на $ uri.php, он не работает ни для .html, ни для .php. Я попытался поставить что-то подобное в php-местоположении, но без каких-либо успехов.

Какие-нибудь советы?

Из того, что я исследовал, добавьте файл /etc/nginx/conf.d/domain.tld.conf, чтобы включить:

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

Затем перезапустите nginx и отпустите его. Надеюсь, это поможет вам! Более подробную информацию можно найти (где я ее нашел) здесь @ tweaktalk.net

Нет необходимости в дополнительных блоках и названных местах и ​​обо всем. Также перемещайте index строку за пределы блока местоположения

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

Имейте в виду, что если у вас есть папка и файл с тем же именем внутри одной и той же папки, например /folder/xyz/ и /folder/xyz.php вы не сможете запустить php-файл, если папка xyz содержит index.php или index.html , просто имейте это в виду.

Чтобы продолжить ответ Мохаммада , вы также можете предложить перенаправления из .html и .php в версии без расширения.

Это может быть выполнено из-за того, что $request_uri содержит «полный исходный запрос URI (с аргументами)» и на него не влияют внутренние перезаписи, которые не видны пользователю.

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

Возможно, это может быть полезно для вас. Простой и выполняет свою работу.

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