Как исключить GET и прочие параметры из URL? (Nginx)

location ~* ^/(sitemap.xml|robots.txt)$ {
    rewrite ^ /seo.php;
}

Работает, в PHP:

switch ($_SERVER['REQUEST_URI']){
    case '/sitemap.xml':

Трудность в том, что какие бы GET параметры не подставить в URL, будет срабатывать правило – подгружать скрипт. Не 404 ошибку выдавать...

Как выполнить так, чтобы на случай дополнительных GET параметров, отдавало 404 код? Как регулярку написать?

Второй вопрос, хотелось бы так же разобраться, как внутри блока, определить, что есть GET параметры. И выполнить перенаправление без них...


Ответы (1 шт):

Автор решения: Ivan Shatsky

С терминологией у вас не очень, обычно это называется аргументами запроса (query arguments). Nginx при определении запроса использует т.н. нормализованный URI, в котором никаких аргументов запроса уже нет, поэтому регулярки тут абсолютно ни к чему. Проверить, есть ли у нас аргументы запроса или нет, можно с помощью встроенной переменной $is_args.

Ответ на первый вопрос:

location ~* ^/(sitemap.xml|robots.txt)$ {
    if ($is_args) { return 404; }
    rewrite ^ /seo.php;
}

Ответ на второй вопрос:

location ~* ^/(sitemap.xml|robots.txt)$ {
    if ($is_args) { return 301 $uri; }
    rewrite ^ /seo.php;
}

Ну а если не заниматься ерундой, то нормализованный URI (без аргументов запроса) внутри PHP-скрипта будет вам доступен через элемент массива $_SERVER['DOCUMENT_URI'].

→ Ссылка