小乐肖 發表於 2023-8-30 16:37:00

nginx 如何禁止 IP 访问,只允许域名访问?

<h2 data-first-child="">方法一:</h2>
<div class="highlight">
<pre><code class="language-text"># 限制IP访问,只允许域名访问, 方法一;
server {
    listen 80 default_server;
    server_name _;

    location / {
      return 403;
    }
}

server {
    listen 80;
    server_name www.server_name1.com;

    location / {
      echo "通过域名访问, $host, $remote_addr";
    }
}</code></pre>
</div>
<p class="ztext-empty-paragraph">&nbsp;</p>
<div class="highlight">
<pre><code class="language-text"># 本地 hosts 文件中配置映射关系
192.168.135.129www.server_name1.com
192.168.135.129www.server_name2.com</code></pre>
</div>
<p class="ztext-empty-paragraph">&nbsp;</p>
<img width="640" height="775" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="775" data-original="https://pic3.zhimg.com/v2-2fa69ffc64d6327743826ae3b671a122_r.jpg" data-actualsrc="https://pic3.zhimg.com/v2-2fa69ffc64d6327743826ae3b671a122_b.jpg" data-original-token="v2-2069ffc0c6cf3d175c3e8ee80e5a5af5" data-lazy-status="ok" data-src="https://pic3.zhimg.com/80/v2-2fa69ffc64d6327743826ae3b671a122_720w.webp">
<p class="ztext-empty-paragraph">&nbsp;</p>
<img width="640" height="431" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="431" data-original="https://pic4.zhimg.com/v2-9f08955f79fdae628eea16056184dda7_r.jpg" data-actualsrc="https://pic4.zhimg.com/v2-9f08955f79fdae628eea16056184dda7_b.jpg" data-original-token="v2-3dd878c281338d410a28f1d885f248cc" data-lazy-status="ok" data-src="https://pic4.zhimg.com/80/v2-9f08955f79fdae628eea16056184dda7_720w.webp">
<p class="ztext-empty-paragraph">&nbsp;</p>
<img width="640" height="871" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="871" data-original="https://pic2.zhimg.com/v2-37add817c2b4632f1ebdf893f84d6865_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-37add817c2b4632f1ebdf893f84d6865_b.jpg" data-original-token="v2-8db498410cd8fe30a54b49645edc3942" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-37add817c2b4632f1ebdf893f84d6865_720w.webp">
<p class="ztext-empty-paragraph">&nbsp;</p>
<p data-pid="tsVS-6P_">原理:</p>
<p data-pid="Pl0EiSf7">直接通过IP地址访问和通过域名访问,请求到达 nginx 时其实都是 IP 地址访问的(域名访问时会做域名解析成IP地址),不同的是直接通过IP地址访问时请求头中 HOST 字段是IP地址,而通过域名访问时请求头中 HOST 字段是域名。</p>
<p data-pid="d1mBDdVz">直接通过IP地址访问时两个 server 块都能匹配上,但是第一个 server 块中 listen 指令使用了 default_server 参数,所以在两个都匹配的情况下,nginx 最终匹配了默认的。</p>
<p data-pid="Sx-PX6Ky">通过域名访问时其实两个 server 块也都能匹配上,但是 nginx 根据它的匹配规则选择了 server_name 指令匹配的那个块,此时不会看 default_server 参数。</p>
<p data-pid="vjcvlOfI">default_server 参数是在最终都可以匹配的情况下去选择这个默认的 server 块。</p>
<p class="ztext-empty-paragraph">&nbsp;</p>
<h2>方法二:</h2>
<div class="highlight">
<pre><code class="language-text"># 限制IP访问,只允许域名访问, 方法二;
server {
    listen 80;
    server_name www.server_name1.com;

    if ($host != 'www.server_name1.com') {
      return 403;
    }

    location / {
      echo "通过域名访问,方法二, $host, $remote_addr";
    }
}</code></pre>
</div>
<p class="ztext-empty-paragraph">&nbsp;</p>
<div class="highlight">
<pre><code class="language-text"># 本地 hosts 文件中配置映射关系
192.168.135.129www.server_name1.com
192.168.135.129www.server_name2.com</code></pre>
</div>
<img width="640" height="835" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="835" data-original="https://pic2.zhimg.com/v2-0c4ebdee49208a4c176c4f2d02f702d9_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-0c4ebdee49208a4c176c4f2d02f702d9_b.jpg" data-original-token="v2-2acc945440eacf2a10f3a99d8137e90e" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-0c4ebdee49208a4c176c4f2d02f702d9_720w.webp">
<p class="ztext-empty-paragraph">&nbsp;</p>
<img width="640" height="374" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="374" data-original="https://pic2.zhimg.com/v2-6ee3303dc21afce4b6dc4bc54318d041_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-6ee3303dc21afce4b6dc4bc54318d041_b.jpg" data-original-token="v2-3d3db687cab9d2b999a86fec731bd265" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-6ee3303dc21afce4b6dc4bc54318d041_720w.webp">
<p class="ztext-empty-paragraph">&nbsp;</p>
<img width="640" height="791" class="origin_image zh-lightbox-thumb lazy lazyload" data-caption="" data-size="normal" data-rawwidth="640" data-rawheight="791" data-original="https://pic2.zhimg.com/v2-ce3f6b36f0e4c647cf6b53dee9183b35_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-ce3f6b36f0e4c647cf6b53dee9183b35_b.jpg" data-original-token="v2-fb252be53c4a0488f1386ae31d3e27bd" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-ce3f6b36f0e4c647cf6b53dee9183b35_720w.webp">
<p class="ztext-empty-paragraph">&nbsp;</p>
<p data-pid="z6Nji9AE">原理:</p>
<p data-pid="yTTZG9aG">直接通过IP地址访问和通过域名访问,请求到达 nginx 时其实都是 IP 地址访问的(域名访问时会做域名解析成IP地址),不同的是直接通过IP地址访问时请求头中 HOST 字段是IP地址,而通过域名访问时请求头中 HOST 字段是域名。</p>
<p data-pid="jwBs5Aud">直接通过IP地址访问时匹配上 server 块了,由于有 $host != 'www.server_name1.com' 判断最终返回 403。</p>
<p data-pid="DMBHxF7M">通过域名访问时匹配上 server 块了,因为访问域名是&nbsp;<span class="invisible">http://www.<span class="visible">server_name1.com</span></span>,所以最终返回正常。</p><br><br>
来源:https://www.cnblogs.com/cnhk19/p/17667658.html
頁: [1]
查看完整版本: nginx 如何禁止 IP 访问,只允许域名访问?