2012-10-14 40 views
13

Tôi biết câu hỏi tương tự đã được hỏi trước đây nhưng tôi chưa tìm thấy bất kỳ câu trả lời thực sự cụ thể nào cho tình huống của tôi..htaccess trong nhiều môi trường

Tôi có một trang web ExpressionEngine chạy trên nhiều môi trường (địa phương, dev, sản xuất), và mỗi người trong số những môi trường cần quy tắc .htaccess khác nhau:

Tất cả các môi trường

Phát triển

  • Password Protect với htpasswd giao thức
  • Force HTTPS
  • Ngăn chặn công cụ tìm kiếm lập chỉ mục với X-Robots-Tag

Sản

  • Force giao thức HTTPS
  • Redirect tên miền phụ không www www

Local

  • Không quy tắc độc đáo.

Tôi đã xem rất nhiều ví dụ về cách bạn có thể đặt môi trường cụ thể theo từng mô-đun. Giống như RewriteCond %{REQUEST_HOST} ^dev.myurl.com cho mô-đun mod_rewrite và tricks like this cho các yêu cầu .htpasswd.

Nhưng điều tôi thực sự thích là một số cách để đặt biến môi trường toàn cầu, sau đó sử dụng lại các biến đó trong tệp .htaccess trên mỗi môi trường. Để sử dụng pseudo-javascript làm ví dụ, một cái gì đó như:

var local = 'mysite.local'; 
var development = 'dev.mysite.com'; 
var production = 'www.mysite.com'; 

// Global .htaccess rules 

if(environment == local){ 
    // Local environment .htaccess rules 
} 

if(environment == development){ 
    // Development environment .htaccess rules 
} 

if(environment == production){ 
    //Production envirotnment .htaccess rules 
} 

Bằng cách này tất cả các quy tắc môi trường cụ thể được tất cả nhóm lại với nhau, làm cho một tập tin thực sự trong sạch, và chỉ có một biến cần phải được thay đổi nếu một môi trường bị thay đổi.

Tôi đã thấy một vài tham chiếu để thay đổi cài đặt trong tệp cấu hình của Apache, nhưng rõ ràng đó không phải là tùy chọn khả thi nếu tôi đang xử lý máy chủ của bên thứ ba.

Vì vậy, đây có phải là suy nghĩ mơ ước trên bầu trời, hay nó có thể được thực hiện?

+0

tôi đi qua [bài viết này] (http://www.thenerdary.net/post/20965499862/htaccess-environment), mà tôi chưa thử nhưng trông đầy hứa hẹn. – kgrote

Trả lời

8

Vì vậy, đây có phải là suy nghĩ mơ ước trên bầu trời, hay nó có thể được thực hiện?

IMO, có. Bạn sẽ không bao giờ có thể nhận được "phạm vi" có thể dự đoán được của các quy tắc dựa trên các biến ENV hoặc bất kỳ thứ gì như thế.Không tồn tại tùy ý if(something) { do everything in here } trong apache. Rất nhiều chỉ thị sẽ không hoạt động bên trong phạm vi nhất định, và sau này, khi bạn cần thay đổi cách thức hoạt động, bạn có nhiều khả năng phá vỡ những gì bạn có hơn là sửa đổi nó.

Cách tốt nhất là để not use htaccess files at all:

Bạn nên tránh sử dụng .htaccess file hoàn toàn nếu bạn có quyền truy cập vào httpd chính tập tin cấu hình máy chủ. Sử dụng các tệp .htaccess sẽ làm chậm máy chủ http Apache của bạn. Bất kỳ chỉ thị nào mà bạn có thể đưa vào tệp .htaccess được đặt trong một khối Directory, vì nó sẽ có tác dụng tương tự với hiệu suất tốt hơn.

Tạo một máy chủ riêng cho địa phương, nhà phát triển và sản xuất. Bật hoặc tắt chúng khi cần, bất kỳ cấu hình chung nào mà chúng chia sẻ, lưu trữ ở nơi khác (như trong tệp có tên global.includes) và sau đó sử dụng chỉ thị Include trong cả 3 vhost. Nếu bạn cần áp dụng các quy tắc cho các thư mục cụ thể, hãy sử dụng khối <Directory> thay vì các tệp htaccess.

Nếu bạn muốn gắn mọi thứ bên trong các tệp htaccess, bạn có thể thử đặt mọi thứ in <IfDefine> blocks, đó có lẽ là điều gần nhất bạn sẽ có với mã giả trong câu hỏi của mình. Về cơ bản cái gì đó như:

# Global htaccess rules 
RewriteEngine On 
RewriteRule ^foo$ /bar [L] 

# Only local 
<IfDefine LocalInstance> 
    RewriteRule ^local/foo /bar [L] 
</IfDefine> 

# Only dev 
<IfDefine DevInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

# Only production 
<IfDefine ProductionInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

Sau đó, khi bạn bắt đầu apache, bạn cần phải vượt qua trong -DLocalInstance, -DDevInstance, hoặc -DProductionInstance như paramaeters dòng lệnh hoặc sử dụng Define chỉ thị (với chỉ một đối số) ở đâu đó trong cấu hình vhost của bạn . Điều này không được đảm bảo để hoạt động trơn tru như nó có vẻ như nó nên, tôi đã chạy vào các vấn đề không giải thích được với <IfDefine> trước, đặc biệt là nếu bạn cố gắng để có được quá ưa thích.

+2

Trong Apache HTTP Server v2.4 một trong những cải tiến cốt lõi là: ', phần có thể được sử dụng để đặt cấu hình dựa trên tiêu chí cho mỗi yêu cầu.' miễn là bạn muốn sử dụng ngữ cảnh thư mục hỗ trợ. http://httpd.apache.org/docs/trunk/mod/core.html#if –

10

Câu trả lời của Jon là câu trả lời hay nhất. Thật không may, không phải tất cả các máy chủ web sẽ cho phép bạn kiểm soát tham số -D đó để khởi động Apache.

Đây là một cách sử dụng một tập tin htaccess duy nhất trên dev và sản xuất, nhưng chỉ có mật khẩu trang web dev bảo vệ:

# ---------------------------------------------------------------------- 
# Password protect staging server 
# Use one .htaccess file across multiple environments 
# (e.g. local, dev, staging, production) 
# but only password protect a specific environment. 
# ---------------------------------------------------------------------- 

SetEnvIf Host staging.domain.com passreq 
AuthType Basic 
AuthName "Password Required" 
AuthUserFile /full/path/to/.htpasswd 
Require valid-user 
Order allow,deny 
Allow from all 
Deny from env=passreq 
Satisfy any 
Các vấn đề liên quan