Hạn chế truy cập IP trực tiếp vào trang web


13

Tôi muốn hạn chế truy cập IP trực tiếp vào trang web của tôi. Tôi tìm thấy một số giải pháp liên quan đến .htaccess nhưng không có công việc nào. Tôi cũng đã tìm thấy một giải pháp thông qua cấu hình máy chủ ảo apache đang hoạt động tốt cho đến khi tôi cài đặt chứng chỉ SSL thông qua CPanel. Tôi hoàn toàn không biết cái gì đã bị thay đổi trong tệp httpd.conf nhưng bây giờ cài đặt chuyển hướng không hoạt động ngay cả khi tôi gỡ cài đặt chứng chỉ SSL.

Đây là thiết lập máy chủ ảo hiện tại của tôi:

NameVirtualhost 192.168.1.1:80 NameVirtualhost *

<VirtualHost 192.168.1.1:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    ## User rotate # Needed for Cpanel::ApacheConf
    UserDir disabled
    UserDir enabled rotate
    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
</VirtualHost>

<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost 192.168.1.1:443
<VirtualHost 192.168.1.1:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off

    UserDir disabled
    UserDir enabled rotate

    ScriptAlias /cgi-bin/ /home/rotate/public_html/cgi-bin/
    SSLEngine on
    #SSL stuff here
</VirtualHost>

IP và tên được thay thế bằng tên chung. Phần "Chuyển hướng 403 /" không hoạt động kể từ khi cài đặt chứng chỉ SSL. Tôi sẽ biết ơn nếu ai đó có thể làm sáng tỏ những gì tôi đang làm sai ở đây. Cảm ơn.


tôi đoán bạn không phải sử dụng = ServerName 192.168.1.1
ADM

Đã thử điều đó quá, không có bất kỳ ảnh hưởng.
Ivan

Virtualhosts đã được sắp xếp lại chưa? Là người có lỗi 403 là vhost đầu tiên (mặc định) trước đây?
Håkan Lindqvist

Không có thứ tự không thay đổi. Vấn đề bắt đầu sau khi thêm chứng chỉ SSL, nghĩa là cái cuối cùng được thêm vào. Bây giờ nếu tôi thậm chí loại bỏ nó hoàn toàn thì nó sẽ không hoạt động nữa nên một thứ khác chắc chắn cũng đã thay đổi nhưng dường như không thể tìm ra cái gì.
Ivan

đây là giải pháp thông qua htaccess serverfault.com/a/171260/273980
jsHate

Câu trả lời:


12

Và voila, cách khắc phục:

<VirtualHost mysite.com:80>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

NameVirtualHost mysite.com:80
<VirtualHost 192.168.1.1:80>
    ServerName 192.168.1.1
    Redirect 403 /
    ErrorDocument 403 "Sorry, direct IP access not allowed."
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UseCanonicalName Off
    UserDir disabled
</VirtualHost>

<VirtualHost *>
    ServerName server.mysite.com
    DocumentRoot /usr/local/apache/htdocs
    ServerAdmin me@mysite.com
    UserDir disabled
</VirtualHost>

NameVirtualHost mysite.com:443
<VirtualHost mysite.com:443>
    ServerName mysite.com
    ServerAlias www.mysite.com
    DocumentRoot /home/rotate/public_html
    ServerAdmin me@mysite.com
    UseCanonicalName Off
</VirtualHost>

Giải pháp đơn giản là thay thế IP bằng tên miền cho tất cả các cài đặt virtualhost, ngoại trừ một cài đặt cần chuyển hướng / hạn chế truy cập IP trực tiếp.


Điều này sẽ gây ra sự cố với các máy khách đang chạy IE6 và IE8. Nếu bạn ổn với điều đó, thì tốt thôi. Họ nên nâng cấp trình duyệt cổ của họ nào.
Vasili Syrakis

6

Câu trả lời có thể đơn giản hơn nhiều.

Chỉ cần sao chép này vào dưới cùng của httpd.conf (thường nằm ở / etc / httpd / conf)

<VirtualHost *:80>
ServerName localhost
Redirect 403 /
UseCanonicalName Off
UserDir disabled
</VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/html
</VirtualHost>

Sau đó, chỉ khi khách truy cập truy cập bằng www.example.com, anh ta mới có thể truy cập vào máy chủ.


2

Bạn không thể vô hiệu hóa quyền truy cập IP trực tiếp vào máy chủ của mình qua HTTPS vì tên máy chủ cho virtualhost của bạn được mã hóa bên trong chứng chỉ SSL.

Khách hàng phải kết nối với địa chỉ IP của bạn, tải xuống chứng chỉ, đọc nội dung và sau đó họ có thể xác minh rằng tên máy chủ là chính xác.

Cách khác là bằng cách thực thi SNI , nhưng bạn sẽ gây ra sự cố cho người dùng đang duyệt với các phiên bản Internet Explorer cũ hơn.


1
  1. Có thể chứng chỉ của bạn được cấp cho example.com, không phải 192.168.1.1, cũng không phải cả hai; Vì vậy, khách truy cập sử dụng https://192.168.1.1phải có lỗi SSL (vì URL khác với chứng chỉ).
  2. Bạn không có trang web 'SSL mặc định' <VirtualHost *:443> SSLEngine on </VirtualHost>
  3. Bạn nên sử dụng apache với hỗ trợ SNI (có một số Yêu cầu phiên bản libSSL và Apache) để sử dụng SSL-per-hostname (xem Sử dụng nhiều chứng chỉ SSL trong Apache với một địa chỉ IP

0

Tôi tin rằng đây là những gì bạn đang tìm kiếm

http://www.htaccess-guide.com/deny-visitor-by-ip-address/


1
Không, điều đó không liên quan gì đến vấn đề của tôi. Tôi muốn chặn truy cập trang web cho những người truy cập IP của trang web của tôi thay vì DNS.
Ivan

chính xác là như vậy ....
user155813

1
Không, điều này chặn truy cập trang web theo địa chỉ IP của khách hàng. Câu hỏi đang tìm cách chặn quyền truy cập vào trang web bằng địa chỉ IP của nó.
DaveTheMinion

0

Để thêm câu trả lời khác, mod_security, nếu nó đáng để bạn thiết lập, có các quy tắc cấm truy cập vào máy chủ bằng địa chỉ ip.


0

Điều này có thể dễ dàng nếu bạn không đặt các tệp của mình vào thư mục mặc định / var / www / html. Chỉ cần tạo một thư mục khác, ví dụ: nói / web:

mkdir /web 
mkdir /web/example

sao chép các tập tin của bạn và thay đổi chown:

sudo chown -R www-data:www-data /web

Sau đó tạo một máy chủ ảo với cấu hình sau:

<Directory /web/example>
  Require all granted
</Directory>

<VirtualHost *:80>

    DocumentRoot /web/example
    ServerName example.com
    ServerAlias www.example.com
    ServerAdmin webmaster@example.com

    # Force SSL, you can remove this line
    Redirect permanent / https://example.com/

    ServerAdmin webmaster@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>

# If you use SSL
<IfModule mod_ssl.c>
    <VirtualHost *:443>
        DocumentRoot /web/example
        ServerName example.com
        ServerAlias www.example.com
        ServerAdmin webmaster@example.com

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # adapt this to your paths
        SSLEngine on
        SSLCertificateFile /etc/ssl/example/example_com.crt
        SSLCertificateKeyFile /etc/ssl/example/example.key
        SSLCertificateChainFile /etc/ssl/example/example_com.ca-bundle

    </VirtualHost>
</IfModule>

Đừng quên bật máy chủ ảo của bạn, ví dụ:

sudo a2ensite example.com.conf

0

Trong một thiết lập Apcahe có nhiều .conftệp, quyền ưu tiên sẽ được tải đến tệp đầu tiên và sau đó là tệp thứ hai .. tương tự như vậy. Vì vậy, nếu bạn đang ở trên Ubuntu, các tệp được tải theo thứ tự từ điển, do đó, .conftệp "đầu tiên" sẽ được tải sẽ là 000-default.conf( do đó 000 trong tên của nó ) nằm trong /etc/apache2/sites-available/thư mục.

Vì vậy, để ngăn chặn bất kỳ quy tắc nào khác được áp dụng, chúng ta cần đưa quy tắc của mình lên đầu tệp đầu tiên đó.

và bạn chỉ có thể thêm các quy tắc sau vào tập tin đó.

<VirtualHost *:80>
    ServerName default
    DocumentRoot /var/www/html
    #This part here, is crucial.
    <Location />
        Require all denied
    </Location>
</VirtualHost>

Đã thử và thử nghiệm trên phiên bản Ubuntu 16.4 x64 Apache > 2.4

Nếu bạn đang chạy phiên bản thấp hơn của Apache, hãy thử thay thế Require all deniedtừ đoạn mã trên thành ...

<Location />
    Order deny,allow
    Deny from all
</Location>

-3

Tôi đã viết mã đơn giản này trong PHP để hạn chế truy cập ip trực tiếp!

$servername =  $_SERVER['SERVER_NAME'];
if($servername == 'your-domain.com'){

}elseif($servername == 'your-domain-with-www.com'){

}else{
    die("Direct ip access not allowed!");
}

chỉ cần dán vào tập tin php của bạn và tận hưởng!


1
Bạn có thể giải thích những lợi thế của điều này hơn các câu trả lời khác?
030

đây là phương pháp đơn giản nhất bạn có thể sử dụng để hạn chế truy cập ip trực tiếp vào trang web của mình mà không cần chỉnh sửa cài đặt apache!
Max Marley
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.