Как заставить nginx возвращать 404, если не запрашивается конкретное доменное имя?

У меня есть сервер nginx и Я хочу вернуть 404, когда anythi ng.mydomain.com запрошен, кроме случаев, когда что-нибудь равно www , mypythonapp1 или mypythonapp2

Я создал 00 -noredirect файл в / etc / nginx / sites-enabled :

server {
    listen 80;
    listen 443 ssl;

    server_name _;

    return 404;
}

К сожалению, все перенаправляется на mypythonapp1 .

Остальные серверные блоки следующие:

server {
    listen mypythonapp1.mydomain.com:80;
    server_name mypythonapp1.mydomain.com;
    (...) 
    listen mypythonapp1.mydomain.com:443 ssl; # managed by Certbot
    (...)
}

Я думаю, это может быть связано с certbot дополнениями в моем / etc / nginx / sites-enabled / mypythonapp1 , хотя Я не уверен:

(...)
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot
(...)

Есть ли что-то, что я должен добавить в 00-noredirect , чтобы избежать этого нежелательного поведения?

РЕДАКТИРОВАТЬ: по просьбе @Tim, вот мой -почти полный- nginx конфигурация:

server {
    listen 80;

    server_name mypythonapp1.mydomain.com;

    disable_symlinks off;

    location /static {
        alias /var/www/mypythonapp/mypythonapp/mypythonapp/static;
    }

    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/var/run/uwsgi/app/mypythonapp1/socket;
    }


    listen 443 ssl; # managed by Certbot
    # some ssl magic here
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot



}
server {
    listen 80;

    server_name mypythonapp2.mydomain.com;

    disable_symlinks off;

    location /static {
        alias /var/www/mypythonapp/mypythonapp/mypythonapp/static;
    }

    location / { try_files $uri @yourapplication; }
    location @yourapplication {
        include uwsgi_params;
        uwsgi_pass unix:/var/run/uwsgi/app/mypythonapp2/socket;
    }


    listen 443 ssl; # managed by Certbot
    # some ssl magic here
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    } # managed by Certbot


}
server {
    listen 80;

    server_name www.mydomain.com mydomain.com;
    root /home/me/mystaticwebsite/;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    listen 443 ssl; # managed by Certbot
    # some ssl magic here
    if ($scheme != "https") {
        return 301 https://$host$uri;
    } # managed by Certbot




}
server {
    listen 80 default_server;

    server_name _;

    return 444;
}

# this last bit I commented out because it broke everything...

#server {
#    listen 443 default_server;
#
#    server_name _;
#
#    return 444;
#}

РЕДАКТИРОВАТЬ2: Изучив error.log (почему я не сделал этого раньше ...) Я понял, что последняя часть «сломала все», потому что не определен «ssl_certificate» в сервере, прослушивающем порт SSL во время установления связи SSL . Я закончил тем, что скопировал строки ssl_certificate и ssl_certificate_key , которые certbot добавил в другие домены. Теперь у меня все еще есть предупреждение о сертификате при запросе something.mydomain.com , но, по крайней мере, если я его обойду, у меня не будет доступа к mypythonapp1 , а это все, что я действительно хотел в первом место.

1
задан 16 May 2017 в 13:59
2 ответа

Tạo khối máy chủ chỉ định server_name theo tên miền bạn muốn phục vụ. Tiếp theo tạo một máy chủ mặc định để xử lý tất cả những người khác. Bạn không nên trả về 404, hãy trả về mã thích hợp hơn.

server {
  # These can be in individual servers if you like
  server_name anything.mydomain.com www.mydomain.com etc.mydomain.com

  # add configuration
}


# This just prevents Nginx picking a random default server if it doesn't know which
# server block to send a request to
server {
  listen      80 default_server;
  server_name _;
  return      444; # "Connection closed without response"
}
3
ответ дан 3 December 2019 в 17:35
 if ($host !~ ^(www.mydomain.com|mypythonapp1.mydomain.com|mypythonapp2.mydomain.com|mydomain.com|localhost)$ ) { return 404; }

если вам нужно вернуть 404, когда пользователь запросил любой домен, который не соответствует вашему списку, вам нужно просто добавить эту строку в свой серверный блок

1
ответ дан 3 December 2019 в 17:35

Теги

Похожие вопросы