只收听一个子域和一个端口

时间:2014-10-24 13:47:29

标签: ssl nginx https subdomain server

我需要了解如何只侦听一个端口 - 主机名组合,并在每个其他请求上返回404.

我的例子:

我为owncloud设置了一个子域,它使用SSL并侦听端口12345而不是443.我们假设这个子域是oc.example.com。所以我希望nginx能够只收听 https://oc.example.com:12345而不是

如果请求任何不完全匹配https://oc.example.com:12345的资源,则应返回错误(例如404未找到),或者服务器不应该响应。

到目前为止我的配置看起来像:

server {
    # I think there's something wrong here?
    listen 12345;
    server_name oc.example.com;
    ssl on;

    ssl_certificate /etc/ssl/nginx/owncloud/owncloud.crt;
    ssl_certificate_key /etc/ssl/nginx/owncloud/owncloud.key;

    add_header Strict-Transport-Security max-age=31536000;
    add_header X-Frame-Options DENY;

     # Path to the root of your installation
    root /var/some/path/to/my/owncloud/;

    client_max_body_size 10G; # set max upload size
    fastcgi_buffers 64 4K;

    rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
    rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
    rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

    index index.php;
    error_page 403 = /core/templates/403.php;
    error_page 404 = /core/templates/404.php;

    ... here are the definitions of my locations
}

我阅读了文档,发现nginx首先通过端口号查找正确的服务器定义。如果存在多个匹配项,则使用server_name查找正确的定义。但我只有一个定义!

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

nginx检查主机标头并选择适当的虚拟主机..为了让它丢弃其他所有内容,只需添加一个“全部”即可。使用default_server指令:

server {
  listen 80 default_server; 
  return 404;
}

除了12345之外,所有对oc.example.com:X的请求都将被默认删除,因为您没有定义在其他端口上侦听的其他虚拟主机。