Я использую nginx и хочу блокировать сообщения, размещать и удалять запросы, когда они приходят от неизвестного реферера.
Это означает, что у меня есть реферер: ".example.com "и от этого реферера я хочу разрешить все GET, PUT и POST (да, я знаю, что реферер легко подделать ...), если".example.com "не является реферером, только GET должен быть разрешен.
Все решения, с которыми я пришел, не работают ...
Я бы хотел, чтобы это было на серверном блоке, чтобы все было чисто (я использую очень большой файл со всеми местоположениями).
Мой первый подход был:
limit_except none block server_names * .example.com {if ($ http_request! = GET) {запретить все; }
Но я не могу вложить деньги, если ...
Затем я попробовал это:
карта $ http_referer $ allow_referer {по умолчанию 0; "~ example.com" 1; } карта $ allow_referer $ disallow_referer {0 1; 1 ""; }
местоположение ... {... if ($ invalid_referer) {limit_except GET {deny all; }}}
То же, что и выше. Затем я использовал файл конфигурации, который нашел в Интернете, с некоторыми изменениями:
установить $ cors '';
if ($ http_origin ~ * (https?: //.*.example.com (: [0-9] +)?)) {set $ cors "true"; }
if ($ request_method = 'OPTIONS') {установить $ cors "$ {cors} options"; }
if ($ request_method = 'GET') {установить $ cors "$ {cors} get"; }
if ($ request_method = 'POST') {установить $ cors "$ {cors} post"; }
if ($ request_method = 'PUT') {установить $ cors "$ {cors} put"; }
if ($ request_method = 'DELETE') {установить $ cors "$ {cors} delete"; }
если ($ cors = "trueget") {возврат 200; }
если ($ cors = "truepost") {возврат 403; }
если ($ cors = "trueput") {возврат 403; }
если ($ cors = "truedelete") {возврат 403; }
Выглядит очень чисто, но не работает.
Есть ли к этому способ?
Я добавил это в серверный блок, и он работает:
add_header Allow "GET, POST, PUT, DELETE, HEAD" always;
valid_referers none blocked server_names *.example.com;
if ($request_method !~ ^(GET)$ ) {
set $req A;
}
if ($invalid_referer) {
set $ref "${req}A";
}
if ($ref = AA) {
return 403;
}