Apache - chỉ nghe trên tên miền cụ thể, không phải IP


9

Làm cách nào tôi có thể định cấu hình apache để nó từ chối các kết nối trực tiếp đến địa chỉ IP ( http://xxx.xxx.xxx.xxx ) thay vì tên vhost http://example.com ?

Cấu hình Virtualhost của tôi:

ServerName example.com

<VirtualHost *:80>

        ServerName example.com

        DocumentRoot /var/www/           
        <Directory /var/www/>                    
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

</VirtualHost>

Câu trả lời:


25

Bạn không thể từ chối các kết nối, vì tên máy chủ (hoặc IP) mà người dùng đang cố sử dụng vì máy chủ HTTP của họ không được biết đến máy chủ cho đến khi máy khách thực sự gửi yêu cầu HTTP. Trình nghe TCP luôn bị ràng buộc với địa chỉ IP.

Thay vào đó, một phản hồi lỗi HTTP có thể được chấp nhận không?

<VirtualHost *:80>
    ServerName catchall
    <Location />
        Order allow,deny
        Deny from all
    </Location>
</VirtualHost>

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/
    <Directory /var/www/>
        AllowOverride All
        Order allow,deny
        allow from all
    </Directory>
</VirtualHost>

Chà, thin mang đến 403 Cấm cho các yêu cầu không đến từ miền, điều này không tệ trong tình huống của tôi. Tuy nhiên, tôi muốn máy chủ "không tồn tại" cho những yêu cầu đó. Tôi chắc chắn điều này có thể được thực hiện bằng cách nào đó, có thể không phải với apache mà ở cấp độ hệ thống?
Alex

3
@Alex Không, nó hoàn toàn không thể. Kết nối TCP phải được thiết lập và khách hàng phải gửi yêu cầu HTTP của họ (hoặc tiêu đề SNI của họ, tôi cho rằng) trước khi có bất kỳ cách nào để máy chủ xác định xem họ đang cố đánh vào tên miền hoặc địa chỉ IP trong yêu cầu HTTP của họ .
Shane Madden

@ShaneMadden Hoàn toàn không thể? Tôi hiểu rằng máy chủ cần biết IP của người dùng trước khi có thể chọn phải làm gì với nó, nhưng hoàn toàn không thể không phản hồi lại lần truy cập này một khi nó biết danh tính của mình? Máy chủ có thể treo kết nối cho đến khi hết thời gian không?
HelpingHand

3
@HelpingHand Không phải IP của người dùng. Máy chủ cần biết tiêu đề máy chủ mà người dùng sẽ gửi trong yêu cầu HTTP, mà nó không có cho đến khi kết nối TCP được thiết lập hoàn chỉnh.
Shane Madden

1
@HelpingHand Không, nó không có khả năng hiển thị trong giao tiếp HTTP xảy ra trong các kết nối.
Shane Madden

0

Bạn phải đi đến lớp thấp hơn, điều này chỉ xuất hiện trong suy nghĩ của tôi trong chuỗi tường lửa có kiểm tra xác thực cho HOÀN TOÀN YÊU CẦU & những gì bạn có với Apache, điều này sẽ cho phép gói bị bỏ qua hoặc bỏ qua


Mặc dù vậy, hoàn toàn có thể làm điều này ở cấp độ apache, vì vậy điều này sẽ là quá mức cần thiết. Một phương pháp đơn giản sẽ là đảm bảo vhost đầu tiên là một sản phẩm bị từ chối truy cập theo cách thân thiện với HTTP.
Paul Dixon

0

Một cách rõ ràng để xử lý việc này là với RewriteRule như sau

<If "%{HTTP_HOST} == 'x.x.x.x'">
  RewriteRule ^.*$ http://www.example.com/$1 [L]
</If>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.