Подтвердить что ты не робот

Как удалить оба .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, но ничего не происходит с .php. Если я изменил $uri.html на $uri.php, он не работает ни для .html, ни для .php. Я попытался поставить что-то подобное в php-местоположении, но без каких-либо успехов.

Любые советы?

4b9b3361

Ответ 1

Из того, что я исследовал, добавьте файл /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

Ответ 2

Нет необходимости в дополнительных блоках и названных местах и ​​т.д. Также перемещайте строку 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 содержится a index.php или index.html, просто помните об этом.

Ответ 3

В дальнейшем ответ Mohammad вы также можете предложить перенаправления от .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
  }
}

Ответ 4

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

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