Больше часа бьюсь над вопросом, перепробовал кучу всего, но всё равно не решил такую проблему с конфигом nginx.
Есть rewrite правило, отображающее файлы в браузере без расширения. Оно нормально работает.
Также есть правило для одной специальной страницы, на которой отображение аргумента тоже рерайтится из /page.php?param=arg в вид /page/arg И, видимо, оно и создает проблему: ошибка 404 вместо того, чтобы показывать заданную страницу, превращается в циклический редирект 301.
Как восстановить нормальную работу error_page 404, оставив и правило для специальной страницы? Есть решение?
Вот сам конфиг:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
root /var/www/example.com/www;
index index.php$is_args$args index.html index.htm;
ssl_certificate /etc/nginx/ssl/self.crt;
ssl_certificate_key /etc/nginx/ssl/self.key;
location ~\.(php|html)$ {
include fastcgi.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
try_files $uri $uri.php $uri/ @extensionless-php;
}
location / {
try_files $uri $uri/ @extensionless-php;
index index.php index.html index.htm;
}
location @extensionless-php {
rewrite ^/(.*/)?index.(php|html|py)$ /$1 permanent;
rewrite ^/(.*)\.(php|html|py) /$1 permanent;
rewrite ^/(.*)/$ $1 permanent;
rewrite ^(.*)$ $1.php?$args;
}
location /page {
rewrite ^/page/([^/]*)$ /page?param=$1;
}
error_page 404 /error;
error_page 403 =404 /error;
}