2011-09-07 31 views
11

Tôi đã tự hỏi liệu có thể thiết lập yêu cầu xác thực cơ bản http có điều kiện dựa trên URL máy chủ ảo trong tệp .htaccess hay không.. Autac cơ bản auth bởi máy chủ ảo?

Ví dụ: những gì tôi muốn làm là có mysite.com và test.mysite.com chạy trên cùng một cơ sở mã trong cùng một thư mục nhưng mật khẩu bảo vệ test.mysite.com. Nó sẽ được thiết lập theo cách này vì vậy mà tôi sẽ không cần phải chi nhánh mã của tôi kể từ khi mã ứng dụng của tôi có thể nhìn thấy vhost/url nó đang được phục vụ từ và chọn cơ sở dữ liệu để phục vụ nội dung từ.

Trả lời

19

Bạn có thể sắp xếp việc này bằng cách sử dụng mod_setenvif cùng với mô-đun mod_auth. Sử dụng chỉ thị SetEnvIfNoCase để đặt máy chủ nào được bảo vệ bằng mật khẩu. Bạn sẽ cần một vài chỉ thị thêm để đáp ứng truy cập:

# Check for the hostname here 
SetEnvIfNoCase HOST ^test\.mysite\.com\.?(:80)?$ PROTECTED_HOST 

Sau đó, bên trong khối Directory (hoặc chỉ cần ở ngoài trời), bạn đã thiết lập auth công cụ của bạn, một cái gì đó như thế này:

AuthUserFile /var/www/test.mysite.com/htpasswd 
AuthType Basic 
AuthName "Password Protected" 

Bây giờ cho các yêu cầu/đáp ứng thứ:

Order Deny,Allow 
Satisfy any 
Deny from all 
Require valid-user 
Allow from env=!PROTECTED_HOST 

Điều này sẽ làm cho nó vì vậy bất kỳ máy chủ đó không phù hợp với ^test\.mysite\.com\.?(:80)?$ sẽ có quyền truy cập mà không cần cho auth (Allow from env=!PROTECTED_HOST) nhưng nếu không, chúng tôi cần người dùng hợp lệ (Require valid-user). Các Satisfy any đảm bảo rằng chúng tôi chỉ cần một trong 2, hoặc cho phép hoặc yêu cầu.

+0

Tôi cố gắng để có một trường hợp có điều kiện kích hoạt nhưng sử dụng để kiểm tra nó, nhưng nó không hoạt động. Bất kỳ ý tưởng? .. Tôi đang sử dụng: SetEnvIfNoCase Host "dev.example.com" DEV ... và sau đó cho trường hợp 'dev' và cho trang web 'thông thường' ... – DM8

+0

@ DM8 Đó không phải là những gì [ thực hiện] (http://httpd.apache.org/docs/2.2/mod/core.html#ifdefine). Các biến này được đặt bởi cờ dòng lệnh '-D'. Chúng không phải là biến môi trường. –

+0

hmm, sau đó ngoài việc chờ máy chủ của tôi nâng cấp lên Apache 2.4 (có khối ...). Có cách nào để có được hành vi mà tôi đã hy vọng? ... trong các tìm kiếm của tôi, tôi đã tìm thấy bài viết sau, điều này dường như chỉ ra rằng có _no_ cách làm điều này trong Apache 2.2x: http: //turboflash.wordpress.com/2010/05/27/apache-môi trường-biến-hiển thị-với-setenv-setenvif-và-rewriterule-chỉ thị/ – DM8

5

Dưới đây là một giải pháp tương tự với những gì Jon Lin đề xuất, nhưng sử dụng RewriteCond để kiểm tra tên máy chủ:

RewriteEngine On 
RewriteCond %{HTTP_HOST} =protected.hostname.com 
RewriteRule ^.*$ - [E=DENY:1] 

AuthUserFile /path/to/htpasswd 
AuthName "Password please" 
AuthType Basic 

Order Deny,Allow 
Satisfy any 
Deny from all 
Require valid-user 
Allow from env=!DENY 
12

Tôi đã có vấn đề triển khai giải pháp của Jon: Mặc dù tôi khá quen thuộc với Apache conf và biểu thức thông thường, việc xác thực luôn được kích hoạt. Từ một cách nhanh chóng phân tích nó trông giống như dòng Allow from env=!PROTECTED_HOST không kick trong

Nhưng tôi tìm thấy một giải pháp mà thực sự trông an toàn hơn với tôi:.

Tôi tạo ra hai máy ảo cho hai lĩnh vực chỉ vào thư mục gốc cùng một tài liệu (được hoàn toàn cho phép bằng cách này). Trong một trong các vhost, tôi đã thêm các chỉ thị cho auth cơ bản (trực tiếp vào khối chỉ thị vhost).

Hoạt động như một sự quyến rũ. Và tôi có một cảm giác tốt hơn rằng điều này thực sự an toàn - không có rủi ro để bỏ qua bất kỳ chi tiết nào trong mẫu regex sẽ mở ra các cổng cho những kẻ xâm nhập.

<VirtualHost *:80> 
    ServerName www.mysite.com 
    DocumentRoot "/path/to/common/doc/root" 

    <Directory "/path/to/common/doc/root"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Order allow,deny 
     Allow from all 
    </Directory> 
</VirtualHost> 

<VirtualHost *:80> 
    ServerName protected.mysite.com 
    DocumentRoot "/path/to/common/doc/root" 

    <Directory "/path/to/common/doc/root"> 
     Options Indexes FollowSymLinks 
     AllowOverride All 
     Order allow,deny 
     Allow from all 

     AuthUserFile /path/to/htpasswd 
     AuthName "Password please" 
     AuthType Basic 
     Require valid-user 
    </Directory> 
</VirtualHost> 
+2

Đây là cách ** đúng ** để thực hiện. Nếu bạn cần 2 vhosts được cấu hình khác nhau, thì bạn cấu hình 2 vhost. Các giải pháp hacky với env var và 'đáp ứng bất kỳ' nên thực sự chỉ được áp dụng nếu bạn đang lưu trữ không cung cấp cho bạn truy cập vào cấu hình vhost/server và bạn còn lại với một giải pháp .htaccess. –

Các vấn đề liên quan