Apache 2.4 hạn chế URL đối với một số IP nhất định


13

Tôi đang cố gắng hạn chế một URL cụ thể chỉ khả dụng ngoài mạng đối với các địa chỉ IP cụ thể. Khi người dùng bên ngoài cố gắng truy cập URL đó chứ không phải từ danh sách IP, anh ta sẽ được chuyển hướng đến trang chủ.

Đây là những gì tôi đã cố gắng cho đến nay mà không gặp may mắn. Phần cuối cùng nó chuyển hướng mọi người đến trang chủ bất kể IP.

<Location "/secret">
#    <If "%{REMOTE_ADDR} != -ipmatch '123.123.123.123/255.255.255.255'">
#    Redirect 303 "/secret" /
#    </If>

RewriteCond "%{REMOTE_ADDR}" "!123\.123\.123\.123"
RewriteRule .* / [R,L]

LogLevel debug rewrite:trace6
</Location>

PS: URL bí mật trên thực tế là một URL ảo và không tồn tại trên thực tế trên ổ đĩa.


các câu lệnh If được bình luận? Cho phép viết lại - RewriteEngine On?
dùng9517

Câu lệnh <If> là một phiên bản mà tôi đã thử. Lệnh RewriteEngine On được khai báo trước đó. Đó là lý do nó chuyển hướng tất cả mọi người
Denis Rendler

1
Tôi nghĩ bạn nên bỏ đánh dấu câu trả lời đã chọn, vì nó không hợp lệ với Apache 2.4 như bạn yêu cầu (nó cung cấp thông tin sai cho những người đi ngang qua)
Erenor Paz

Câu trả lời:


3

Sử dụng Order, Denyallowđể xác định những người có quyền truy cập vào vhost hoặc vị trí của bạn.

<VirtualHost *:80>
    ServerName example.net
    DocumentRoot /docroot

    <Directory "/docroot">
        Order Deny,Allow
        Deny from all
        Allow from 10.10.10.10
        Allow from 10.10.11.0/24
    </Directory>   
</VirtualHost>

Khi nói đến chuyển hướng, hãy nghĩ về một trang lỗi tùy chỉnh . Điều này là tổng quát hơn nhiều, bởi vì mọi truy cập trái phép sẽ gây ra lỗi 403 và do đó có thể được đánh giá dễ dàng.

Tôi chưa bao giờ làm điều này với apache, nhưng sử dụng chiến lược gia này với nginx. Đối với apache somhin như thế này nên làm:

ErrorDocument 403 http://homepage.example.com

Các tài liệu lỗi tùy chỉnh được cấu hình bằng chỉ thị ErrorDocument, có thể được sử dụng trong bối cảnh toàn cầu, virtualhost hoặc thư mục. Nó có thể được sử dụng trong các tệp .htaccess nếu AllowOverride được đặt thành FileInfo. (từ tài liệu apache)


2
Đây trông giống như một bộ cấu hình Apache httpd 2.2. Nó vẫn sẽ hoạt động với 2.4 chứ?
dùng9517

Ít nhất là ErrorDocumentmột phần từ 2,4 tài liệu. Tôi không sử dụng apache, vì nginx ở xung quanh, nhưng giả sử rằng Order, DenyAllowvẫn còn xung quanh trong apache 2.4
ansi_lumen

Cảm ơn, nhưng tôi không giúp. Tôi quên đề cập, nhưng tôi đã cập nhật câu hỏi, URL / bí mật trên thực tế là một URL ảo và không tồn tại trên thực tế trên ổ đĩa. URL nó tự viết lại từ index.php, đó là lý do tại sao tôi sử dụng lệnh <Location>.
Denis Rendler

4
Cú pháp này không được dùng trong apache 2.4
Luca Reghellin

1
Tại sao đây là câu trả lời được chấp nhận? Đây là cho Apache 2.2 chứ không phải 2.4 như câu hỏi ngụ ý ... Điều này sẽ không hoạt động.
Jeremy

22

Các tùy chọn Đặt hàng, Từ chối và Cho phép đã được thay thế trong Apache 2.4 bằng

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
</Directory>

Bạn có thể hạn chế rõ ràng các địa chỉ thông qua việc sử dụng các mục sau:

<Directory /var/www/mysite.com/htdocs/public>
    Require all granted
    Require not ip 192.168.0.1
</Directory>

Điều ngược lại cũng đúng, để hạn chế tất cả và chỉ cho phép một tập hợp con sử dụng như sau:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
</Directory>

Thông tin thêm có sẵn trên tài liệu kiểm soát truy cập Apache 2.4.

Liên quan đến câu hỏi của bạn (do tôi tự chỉnh sửa do thiếu điểm để thêm nhận xét), bạn có thể chỉ cần đặt ErrorDocument với chỉ mục được đặt làm đường dẫn URL:

<Directory /var/www/mysite.com/htdocs/public>
    Require host example.com
    Require ip 192.168.0.1
    ErrorDocument 401 /index.html
</Directory>

Hi vọng điêu nay co ich!


Cảm ơn, @Linztm! Nhưng điều này chỉ giải quyết được một phần vấn đề của tôi. Tôi không muốn chỉ chặn người dùng mà còn chuyển hướng anh ta đến trang chủ.
Denis Rendler

Nó dường như chỉ hoạt động với chỉ thị ErrorDocument nếu tôi cung cấp URL đầy đủ bao gồm tên miền và giao thức. Tôi sẽ nghiên cứu thêm. Cảm ơn.
Denis Rendler

Tôi đã tìm thấy ít nhất một trường hợp khi bạn cần sử dụng allowmặc dù không dùng nữa, Require 127.0.0.1 vẫn cho phép truy cập bằng địa chỉ bên ngoài từ máy cục bộ, trong đó như cú pháp cho phép chỉ cho phép từ 127 địa chỉ.
Alexei Martianov

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.