2012-05-22 40 views
19

tl; dr: Làm thế nào để làm như sau trong một conf hoặc tập tin .htaccess:Phát hiện phiên bản Apache trong cấu hình apache?

<IfApache22> 
    # Do A 
</IfApache22> 
<IfApache24> 
    # Do B 
</IfApache24> 

Còn câu hỏi:

Với Apache 2.4 cũ Order get của phản đối ủng hộ Require.

Trong file .htaccess của tôi, tôi có

<FilesMatch "\.(long|list|file|types)$"> 
    Order allow,deny 
</FilesMatch> 

có nghĩa là Apache thất bại trong việc bắt đầu, trừ khi tôi cho phép access_compat. Trong khi làm như vậy trình bày một cách giải quyết hữu ích, tôi muốn một giải pháp làm việc với cả hai cú pháp khi cấu hình sẽ được phân phối cho rất nhiều máy chủ. Câu hỏi đặt ra là làm cách nào tôi có thể phát hiện phiên bản Apache hiện tại và áp dụng đúng chỉ thị.

Tôi dự định sử dụng tệp cho khung được phân phối và sử dụng bởi nhiều người và tôi không thể kiểm soát/đảm bảo rằng họ có hoặc thiếu bất kỳ thiết lập máy chủ cụ thể nào, đó là lý do tôi muốn tập tin là 2.2/2.4 "bất khả tri".

Trả lời

2

Bạn có thể chạy các phiên bản Apache khác nhau trên cùng một máy chủ. Q: Có gì sai với các tập tin cấu hình riêng biệt trong các thư mục riêng biệt? Tôi thành thật tin rằng đó là lẽ là phương pháp sạch ...

Tuy nhiên, các file Apache conf cho phép một <IfDefine>, mà bạn có thể chỉ định khi chạy với "-D":

http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine

+1

+1 cho tùy chọn IfDefine và -D. Nó không thực sự giúp tôi mặc dù. Chạy hai phiên bản của máy chủ web có vẻ như _a lot_ của công việc khi một đơn giản nếu/người nào khác có thể giải quyết nó. Bạn có thể mở rộng "các thư mục riêng biệt" hơn một chút không? Kiểm tra phiên bản hiện tại có vẻ như là một giải pháp rất hay cho tôi. Mở rộng câu hỏi một chút về lý do tại sao. – Letharion

27

Một hack mà tôi đã sử dụng.

# Apache 2.2 
<IfModule !mod_authz_core.c> 
    Satisfy Any 
</IfModule> 

# Apache 2.4 
<IfModule mod_authz_core.c> 
    Require all granted 
</IfModule> 
+1

... hoặc nếu mô-đun đó vắng mặt ở cả hai đầu, nhưng máy chủ cục bộ/giai đoạn của bạn thắng (và Apache 2.x) và trực tiếp của bạn là linux (và Apache 2.y), hãy kiểm tra bất kỳ sự khác biệt nào của mô-đun, tức là '' –

+0

câu trả lời tuyệt vời. Tất cả mọi thứ dường như xây dựng cho 2,4, nhưng tôi là 2,2, điều này cho phép khả năng tương thích về phía trước! – Keith

1

Bạn có thể bỏ qua sự cần thiết phải biết bằng cách sử dụng mod_rewrite để kiểm soát truy cập của bạn:

RewriteEngine On 
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$ 
RewriteRule .* - [F,L] 
14

Giả sử bạn có mod_version cài đặt (nhiều bản phân phối vận chuyển nó theo mặc định), bạn có thể làm như sau:

<IfVersion >= 2.4> 
    # Require ... 
</IfVersion> 
<IfVersion < 2.4> 
    # Order ... 
    # Deny ... 
    # Allow ... 
</IfVersion> 
+3

Tôi đề nghị câu trả lời này. Nếu bạn có thể đủ khả năng phụ thuộc, cách tiếp cận này rõ ràng hơn nhiều. Ngoài ra, nếu mod_authz_core bị vô hiệu hóa khi sử dụng phương pháp tiếp cận trong câu trả lời được chấp nhận thì tệp cấu hình sẽ giả sử nó đang chạy trên 2.2 và tiếp tục bất kể. Loại bỏ mod_version ở đây sẽ có nghĩa là máy chủ sẽ từ chối khởi động. – seanhodges

1

Tôi gặp sự cố này vì FallbackResource không có trong các phiên bản đầu của Apache và thường các công ty lưu trữ thông minh xóa mod_rewrite khi họ có phiên bản A pache với FallbackResource. Tôi sử dụng .htaccess sau khi tôi muốn đặt thư viện mã lên đó thích nghi với môi trường của nó:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteRule^- [E=protossl] 
    RewriteCond %{HTTPS} on 
    RewriteRule^- [E=protossl:s] 
    RewriteRule "(^|/)\." - [F] 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_URI} !=/favicon.ico 
    RewriteRule^index.php [L] 
</IfModule> 

<IfModule !mod_rewrite.c> 
    FallbackResource index.php 
</IfModule> 

Bây giờ tất nhiên có một số phiên bản Apache/thiết lập nơi này không thành công - nhưng nếu mod_rewrite là có, sử dụng nó và nếu không, hy vọng rằng FallbackResource là có.

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