Как донать с 404 на nginx

Я хочу защитить некоторые местоположения в nginx, указав директивы deny/allow, но я не хочу, чтобы посторонние знали, что местоположение запрещено. Я хочу, чтобы посторонний получил 404, а не 403 http-код. Мой фрагмент конфигурации

location /admin/ {
    uwsgi_pass myupstream1;
    include /path/to/uwsgi_params;

    allow 127.0.0.1;
    deny all;
}

Когда я пытаюсь посетить /admin/, nginx отвечает HTTP 403, но я хочу, чтобы он ответил HTTP 404. Есть ли какой-нибудь рецепт для этого?


person Dmitry Mugtasimov    schedule 14.10.2014    source источник


Ответы (4)


error_page 403 404 /404.html;

location = /404.html {
    internal; #return 404
}

location /admin/ {
    uwsgi_pass myupstream1;
    include /path/to/uwsgi_params;

    allow 127.0.0.1;
    deny all;
}

По умолчанию 'internal' возвращает 404.

Адаптировано из этого ответа здесь

person ARGB32    schedule 03.02.2015
comment
Действительно ли это возвращает правильный код ошибки или просто правильный ресурс? - person Nathan Tuggy; 03.02.2015
comment
Я не проверял заголовки ответа, но предполагаю, что он ответит 403. Я нашел другое решение, которое может работать намного лучше. - person ARGB32; 04.02.2015
comment
Но это изменит все 403 на 404 или нет? Мне больше нравится другой ответ, где вы добавляете строку return 404; после отказа. - person therealmarv; 27.07.2015
comment
Это действительно изменит все ответы 403 на 404. Если вы хотите сделать это поведение специфичным для /admin/, вы должны переместить 'error_page 403 404 /404.html;' в свой блок местоположения - person Neil Bryson; 17.05.2017
comment
Хотя этот ответ действительно работает, документы nginx предполагают, что в первой строке должен быть оператор присваивания, то есть «error_page 403 = 404/404.html;» - person Neil Bryson; 17.05.2017

Более элегантный способ — создать пользовательскую страницу ошибок. На этой странице вместо отображения кода ошибки http вы можете указать собственное сообщение.

Назовите страницу ошибки

error_page 403 =404 /40X.html;

    location /admin/ {
        uwsgi_pass myupstream1;
        include /path/to/uwsgi_params;
        allow 127.0.0.1;
        deny all;  
    }

    location /40X.html {
    root path/to/public;
    }

В вашем 40x.html вы можете написать любое сообщение

<html>
<body> The requested resource is not available </body>
</html>

поместите этот 40x.html в свой путь/в/общедоступный каталог

person dev0z    schedule 14.10.2014
comment
Спасибо за это. Это уже было в моем конфигурационном файле для 50x, я не знал, что это способ сделать что-то, действительно хороший, знаю, что они не знают, существует ли место на самом деле или нет :) - person Rens Tillmann; 12.11.2015
comment
Я проверил возвращенные заголовки 404 с помощью addons.mozilla.org/en-US/firefox/addon/live-http-headers — использование internal в строфе /40X.html (вместо root path) возвращает страницу 404 по умолчанию. - person Stuart Cardall; 03.03.2016

Вы можете использовать «переписать» вместо «запретить все».

location /admin/ {
    uwsgi_pass myupstream1;
    include /path/to/uwsgi_params;

    #allow 127.0.0.1;
    #deny all;

    rewrite ^/admin/(.*)$ /404.php?id=$1;

}

Поместите 404.php в корень вашего домена (например, _http://127.0.0.1/404.php) или измените «путь/к/файлу/404.php?id=$1»

person Jonny    schedule 05.04.2015

возврат 404; сделает то, что вы хотите. Смотрите ниже

    location /admin/ {
        uwsgi_pass myupstream1;
        include /path/to/uwsgi_params;

        allow 127.0.0.1;
        deny all;
        #Following line returns 404
        return 404;
    }
person Omid Kosari    schedule 09.05.2015
comment
Я пробовал это, но он возвращает 404 как при разрешении, так и при отказе - person baselq; 02.12.2015
comment
Это не работает. Более того, deny правило стало нерабочим - person BambinoUA; 31.01.2020