2011-05-26 37 views
22

Chúng tôi có quy trình làm việc này: Quá trình phát triển được thực hiện trên dev.example.com Các thay đổi được cam kết với SVN, sau đó được xuất sang trang web trực tiếp. Trang web trực tiếp có tại www.example.comTôi có thể bảo vệ mật khẩu bằng cách nào nhưng không sống trong khi sử dụng SVN?

Tôi muốn bảo vệ bằng mật khẩu dev.example.com, nhưng nếu tôi làm điều đó với .htaccess, chúng tôi sẽ sử dụng cùng một .htaccess tại trang web trực tiếp và mật khẩu sẽ nhận mật khẩu cũng được bảo vệ.

Chúng tôi đang sử dụng lưu trữ chia sẻ Dreamhost, tôi có quyền truy cập SSH, nhưng tôi không thể chỉnh sửa tệp cấu hình .conf của Apache.

Chúng tôi không muốn có tệp .htaccess riêng biệt cho dev & trực tiếp và bỏ qua .htaccess trong SVN vì các bản cập nhật cũng được thực hiện đối với .htaccess.

Vì vậy, tôi nên làm gì?

Trả lời

37

Nếu mod_setenvif được kích hoạt trên máy chủ, bạn có thể thêm video này vào .htaccess tập tin của bạn:

SetEnvIfNoCase ^HOST$ .+ unauthenticated 
SetEnvIfNoCase ^HOST$ ^dev\.example\.com$ !unauthenticated 

AuthType Basic 
AuthName "Secured" 
AuthUserFile /path/to/.htpasswd 
Require valid-user 
Order allow,deny 
Allow from env=unauthenticated 
Satisfy any 

Điều này về cơ bản không là nó đặt một biến môi trường được gọi là "xác thực" nhưng unsets nó nếu HOST (các máy chủ được trình duyệt yêu cầu) chính xác là "dev.example.com". Trong chỉ thị Thư mục, "thỏa mãn bất kỳ" cho Apache biết để cho phép yêu cầu nếu có bất kỳ điều kiện nào được đáp ứng. Điều này có nghĩa là trên "dev.example.com", biến môi trường sẽ không được đặt và như vậy, bạn sẽ được yêu cầu mật khẩu. Đối với bất kỳ máy chủ nào khác, biến sẽ được đặt để Apache sẽ không yêu cầu thông tin đăng nhập.

+0

Tuyệt vời! Làm thế nào tôi có thể kiểm tra xem nếu tôi đã bật mod_setenvif? – celiker

+1

Bạn có thể thử 'apache2 -t -D DUMP_MODULES' hoặc' httpd -M' nếu thông qua SSH nếu bạn có thể chạy chúng. Bạn có thể đặt một tệp PHP nhỏ trên máy chủ bằng ' ', truy cập nó bằng trình duyệt web của bạn và tìm" Mô-đun được tải "dưới" apache2handler "(giả sử bạn sử dụng Apache 2). Hoặc bạn có thể thử và nếu bạn gặp lỗi máy chủ nội bộ 500 tại thời điểm đó, bạn có thể không được phép đặt một số cài đặt trên mô-đun không khả dụng. –

+0

Cảm ơn! Điều đó giải quyết được câu hỏi của tôi cũng http://stackoverflow.com/q/5471306/351893 – JochenJung

9

Bạn có thể bỏ qua .htaccess, giữ nó hoàn toàn khỏi kho lưu trữ của mình. Sau đó, chỉ có hai tệp .htaccess khác nhau trên mỗi máy chủ. Bởi vì chúng bị bỏ qua, chúng sẽ không bị ghi đè trong bản cập nhật SVN.

+1

Nhưng chúng tôi đang thực hiện thay đổi trong .htaccess và cũng muốn giữ những thay đổi đó trong SVN. – celiker

+0

@formicin Tôi hiểu. Có thể có một mẹo để đưa cả hai thứ vào một tập tin .htaccess (giống như điều kiện), nhưng tôi không thể nghĩ ra được ... –

+2

@formicin * có thể * trợ giúp: [Làm thế nào tôi có thể có khối .htaccess có điều kiện ?] (http://stackoverflow.com/q/736524) –

2

Thay vì phát triển trên máy chủ từ xa, tại sao không phát triển trên các máy cục bộ của bạn? Bạn có thể tạo các nhánh trong repo của bạn cho từng dev, và hợp nhất các thay đổi của chúng với trunk khi chúng sẵn sàng để được đẩy đến trang web trực tiếp.

+2

Tôi sở hữu trang web và đã thuê thêm nhà phát triển. Có một dev.example.com là cách tốt nhất để xem các thay đổi cùng nhau. – celiker

6

Do nó trong cấu hình virtualhost Apache chứ không phải là một tập tin .htaccess (mà thường sẽ nằm trong /etc/apache hoặc /etc/apache2.)

tôi đặt tất cả mọi thứ mà sẽ đi vào .htaccess của tôi ở đây để thay thế. Các cài đặt này thường cần phải khác nhau theo từng lần triển khai, do đó, có ý nghĩa để giữ chúng bên ngoài repo. Nó cũng làm cho ứng dụng của bạn nhanh hơn một chút nếu Apache có thể tải các chỉ thị khi nó khởi động, thay vì từ tệp .htacess trên mọi yêu cầu.

Tôi cũng thường đặt một chỉ thị như thế này trong đó: SetEnv APP_ENV production

Mà sẽ có được thông qua thông qua ứng dụng của bạn và cho phép bạn để phát hiện xem bạn đang ở trong một dev vs môi trường sản xuất và điều chỉnh cài đặt của bạn cho phù .

Tôi cũng giữ một bản sao của tệp conf này được kiểm tra vào thư mục nội dung của repo của tôi để dễ dàng truy cập.

+0

Tôi đã làm điều này nhiều lần trước đây - mặc dù thậm chí tốt hơn nếu bạn cũng có thể làm phát triển của bạn tại địa phương, và kiểm tra vào SVN chỉ khi bạn biết nó hoạt động. –

+0

Vâng, tôi đồng ý, phát triển tại địa phương là tốt nhất trong mọi trường hợp. – dleavitt

+0

Ở đây! Đây! +1. (thêm các ký tự để hoàn thành min. char req's) – cwallenpoole

3

Đặt hai tập tin trong kho của bạn:

  • htaccess.dev
  • htaccess.live

Thực hiện một kịch bản trong đó có chăm sóc của triển khai bằng cách đầu tiên làm một xuất khẩu của tất cả các file đến máy chủ đích và sau đó đổi tên tệp htaccess chính xác tùy thuộc vào máy chủ mà nó được xuất sang. Tập lệnh nên đơn giản để gọi và triển khai toàn bộ trong một bước, bao gồm việc xử lý tên máy chủ cho máy chủ, v.v.

deploy dev hoặc deploy live là hai dòng lệnh tốt để nhắm tới.

Đối với đăng nhập ssh, bạn sẽ phải nhắc người dùng nhập mật khẩu từ tập lệnh hoặc tốt hơn, sử dụng xác thực dựa trên khóa để đăng nhập tự động.

2

Bạn nên thực sự giữ cho môi trường phát triển và sản xuất của mình càng tách biệt càng tốt. Tôi khuyên bạn nên đánh giá lại mong muốn ban đầu của mình để sử dụng tệp tin chia sẻ .htaccess. Theo kinh nghiệm của tôi, các tệp máy chủ như .htaccess thường không được cập nhật thường xuyên, vì vậy nó sẽ không gây rủi ro cho năng suất.

Nếu bạn đang sử dụng máy chủ ảo, bạn có thể đặt mã ủy quyền trong tệp đó (tệp cấu hình httpd hoặc vhosts), cho phép bạn vẫn sử dụng tệp .htaccess được chia sẻ.

-1

Hai đề xuất đơn giản - không yêu cầu .htaccess hoặc cấu hình máy chủ.

1) Nếu bạn đang xây dựng trên khung CMS như Wordpress, bạn có thể chỉ cần đặt cài đặt bảo mật cho trang web (bảng điều khiển> cài đặt) thành mật khẩu được bảo vệ trên trang web dev và vì tất cả các cài đặt đó đều được quản lý cơ sở dữ liệu , bạn chỉ có thể đặt trang web trực tiếp thành công khai.

... HOẶC ...

2) Phát triển cục bộ và đẩy tới cài đặt được bảo vệ bằng mật khẩu riêng.

1

Do một nhập khẩu trong tiêu đề của tập tin của bạn để kéo trong một file include("permission.php")

trên dev.example.com: permission.php

<?PHP 
    // Do a password check 
?> 

trên www.example.com: phép .php

<?PHP 
    // Just an empty file 
?> 

trên trang web dev nó sẽ thực hiện những gì cần phải làm cho passwording, nhưng trên trang web trực tiếp nó sẽ làm nothi ng tất cả.

+0

Bạn không thể cam kết 2 bản sao khác nhau của cùng một tệp trong cùng một kho lưu trữ SVN. Giải pháp này sẽ không làm việc vì lý do đó một mình. Nó sẽ giống hệt nhau khi có 2 phiên bản khác nhau của các tệp .htaccess không được phiên bản mà anh ấy đã tuyên bố rõ ràng rằng anh ấy không muốn làm. –

2

@formicin,

Tôi giả định rằng mục tiêu chính là giữ cho mắt tò mò tránh xa nội dung của bạn.

Nếu logic được triển khai trong mã (và không phải thông qua cấu hình Apache), bạn có thể sử dụng tên máy chủ được chỉ định trong chính yêu cầu HTTP.

$dev_server = "dev.mysite.com"; 
$hostname_used_to_access_site = $_SERVER['SERVER_NAME']; 

if (strcasecmp($hostname_used_to_access_site, $dev_server) == 0) { 
    // The server name sent by the browser matches the name 
    // of the dev server, so check for a valid session. If 
    // the user hasn't already logged in, redirect to a 
    // login page. 
} 

Điều này có thể được đưa vào tệp chung bao gồm hoặc ở đầu mỗi trang. Lưu ý rằng mã sẽ giống nhau giữa dev và production, nhưng giá trị của $_SERVER['SERVER_NAME'] sẽ làm cho mã đăng nhập chỉ được thực thi trên máy chủ dev.

Vui lòng nhận xét nếu tôi đã bỏ lỡ nhãn hiệu hoặc nếu bạn muốn làm rõ về cách xử lý thông tin đăng nhập.

Cảm ơn!

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