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

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

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

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

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

какие советы?

4 ответов


из того, что я исследовал, если вы добавите свой /etc/nginx/conf.д/домен.дву.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 ^(.*)$ .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 /;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
  }
  location ~ \.php$ {
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /?$args;  }
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}

возможно, это может быть полезным для вас... Это просто и получает работу:

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