Как удалить оба .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-местоположении, но без каких-либо успехов.
Любые советы?
Ответы
Ответ 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;
}