Блок местоположения nginx, фиксирующий значение и устанавливающий cookie, если он не пустой, перенаправляет на новый URL - PullRequest
0 голосов
/ 26 июня 2018

Трудно подвести итог в заголовке ... Я пытаюсь создать URL, который сохранит указанное значение в cookie, а затем перенаправит пользователя, чтобы избавиться от значения в URL.

Желания:

domain.com / конц.php (не изменяйте cookie!) Этот файл не важен, но было бы неплохо

domain.com / конц.php

То, что я сейчас написал:

location ~ ^/importantpage/?(.*?)$ {
    add_header Set-Cookie "secret_code=$1;Domain=$server_name;Path=/;Max-Age=31536000;Secure;HTTPOnly" always;
    return 307 $scheme://$server_name/importantpage.php;
}

Этого недостаточно, потому что domain.com/importantpage (с косой чертой или без нее) устанавливает для куки значение BLANK.Я хочу, чтобы пользователи могли переходить по адресу domain.com/importantpage и читать его, если он был предоставлен.

Я думал о том, чтобы разбить его в двух местах, например:

location ~ ^/importantpage$ {
    return 307 $scheme://$server_name/importantpage.php;
}

location ~ ^/importantpage/(.*?)$ {
    add_header Set-Cookie "secret_code=$1;Domain=$server_name;Path=/;Max-Age=31536000;Secure;HTTPOnly" always;
    return 307 $scheme://$server_name/importantpage.php;
}

Но по некоторым причинам, в которых я не уверен ... это не работает так, как я себе представляю.Теоретически, верхний должен вызываться только domain.com/importantpage и избегать установки cookie ... но если / предоставляется (со значением или без него), второй должен вызываться ... но вместо этого, когда яперейдите на domain.com/importantpage, это все еще устанавливает cookie с пустым значением ??Хотя второй ТРЕБУЕТ косой черты, чтобы соответствовать ему?Может быть, что-то неочевидное происходит за кулисами.

У кого-нибудь есть идеи?Возможно, есть способ заставить регулярное выражение соответствовать 1 или более непробельным символам, или оператор IF для вызова setcookie, только если значение не пустое?

1 Ответ

0 голосов
/ 26 июня 2018

В фрагменте одиночного блока ^/importantpage/?(.*?)$ соответствует /importantpage, за которым следуют ноль или одна косая черта, за которыми следует ноль или более символов, после которых следует конец ввода, поэтому соответствует /importantpage/aSECRETvalue33, /importantpage и /importantpageisnothere/some/other/path. Обратите внимание, что .*? похоже на .* (ноль или более любого символа), но соответствует не жадно, что в этом случае не требуется, поскольку единственный символ, которому вы позволили следовать за ним, это конец ввода в любом случае.

В фрагменте с двумя блоками, поскольку оба являются неточными префиксами, nginx ищет самое длинное совпадение . Вместо этого вы можете разделить свои блоки на точные совпадения и совпадения префиксов:

location = /importantpage {
    return 307 $scheme://$server_name/importantpage.php;
}

location = /importantpage/ {
    return 307 $scheme://$server_name/importantpage.php;
}

location ~ ^/importantpage/(.+)$ {
    add_header Set-Cookie "secret_code=$1;Domain=$server_name;Path=/;Max-Age=31536000;Secure;HTTPOnly" always;
    return 307 $scheme://$server_name/importantpage.php;
}

Или вы можете справиться только со вторым случаем, установив регулярное выражение, чтобы оно совпадало только тогда, когда после /:

есть символы
location ~ ^/importantpage/(.+)$ {
    add_header Set-Cookie "secret_code=$1;Domain=$server_name;Path=/;Max-Age=31536000;Secure;HTTPOnly" always;
    return 307 $scheme://$server_name/importantpage.php;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...