Назад | Перейти на главную страницу

Блокировать POST PUT и DELETE, но разрешить GET от определенного реферера

Я использую 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;
   }