Как настроить редирект Nginx для ЧПУ?

Имеется сервис с URL двух типов:
  • domain.com/?page=somepage
  • domain.com/?page=somepage&value=somevalue

Значения переменных $page и $value используются для дальнейшей обработки и вывода необходимого содержимого.
Необходимо сделать редирект, и привести URL к виду:
  • domain.com/somepage
  • domain.com/somepage/somevalue

По отдельности для того или иного URL реврайты работают, но объединить их знаний nginx не хватает.
location / {
        try_files $uri $uri/ @fallback;
    }

    location @fallback {
        rewrite ^/(.*)$ /index.php?page=$1&$args last;
    }

и соответственно
location / {
        try_files $uri $uri/ @fallback;
    }

    location @fallback {
        rewrite "^/([^/]*)/(.*)(/?)+$" /index.php?page=$1&value=$2 last;
    }


Полный конфиг nginx

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name ${NGINX_HOST};

    index index.php;

    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    root /var/www/html/public;

##    error_page 404 /index.php;

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    location / {
        try_files $uri $uri/ @fallback;
    }

    location @fallback {
        rewrite ^/(.*)$ /index.php?page=$1&$args last;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;
        log_not_found off;
    }
}

  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
phoinixrw
@phoinixrw
Архитектор информационных систем
Второе регулярное выражение у вас работает случайно.

Конструкция:

(/?)+

Вызывает несколько вопросов

А вообще:

location / {
    try_files $uri $uri/ @fallback;
}

location @fallback {
    rewrite "^/([^/]+)/?([^/]+)?/?$" /index.php?page=$1&value=$2&$args last;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы