2009-04-10 10 views
15

Đây là một câu hỏi Apache mà bạn có thể gặp phải trước đây. Tôi muốn có một gói nguồn mà tôi có thể triển khai đến máy trạm của mình, máy chủ dàn dựng của tôi và máy chủ sản xuất của tôi, nhưng để nó tải các cài đặt .htaccess khác nhau dựa trên URL được sử dụng.Tôi có thể có khối .htaccess có điều kiện như thế nào?

Lưu ý rằng tôi đang sử dụng một kludge với một cuộc gọi IfModule, nhưng điều đó sẽ không hoạt động với máy chủ sản xuất mới của chúng tôi vì nó chia sẻ tất cả các mô-đun giống như máy chủ dàn dựng của tôi.

Lưu ý Tôi cần phải nhóm SetEnv bằng các ghi đè này. Hiện tại nếu bạn sử dụng RewriteCond, nó chỉ liên kết với RewriteRule sau đây, nhưng không gắn với SetEnv bên dưới.

Trả lời

15

Thay vì sử dụng setenv, sử dụng khả năng biến môi trường thiết lập của RewriteRule bản thân:

RewriteCond %{HTTP_HOST} =foo.com 
RewriteRule^- [E=VARNAME:foo] 

RewriteCond %{HTTP_HOST} =bar.com 
RewriteRule^- [E=VARNAME:bar] 

Mặc dù tôi thích thực hiện việc này bằng cách truyền cờ cho tiến trình httpd khi khởi động và tìm kiếm chúng bằng cách sử dụng khối IfDefine.

<IfDefine FOO> 
SetEnv VARNAME foo 
</IfDefine> 

<IfDefine BAR> 
SetEnv VARNAME bar 
</IfDefine> 
+0

Cần lưu ý rằng chỉ thị php_value trong Apache không thể được gọi trong ví dụ đầu tiên - chỉ các biến môi trường. Trong ví dụ thứ hai, đây là lựa chọn tốt nhất bởi vì bạn có thể định nghĩa nghĩa là máy chủ của bạn. Tuy nhiên, điều này chỉ hoạt động nếu bạn kiểm soát môi trường. Nếu bạn đang ở trên một máy chủ chia sẻ, bạn không có cách nào để kiểm soát việc truyền tham số cho quy trình httpd. Vì vậy, bạn tìm kiếm nghịch đảo của điều này với . –

+1

Tôi thấy tôi có thể sử dụng IfDefine vì máy chủ prod của tôi được kiểm soát 100% bởi tôi và tôi có thể gây rối với tham số OPTION/etc/sysconfig/httpd OPTION và làm cho nó OPTIONS = "- D prod". Trên máy chủ dàn dựng, được chia sẻ, tôi đã phải sử dụng IfDefine! Prod và sau đó ngăn xếp một IfModule expires_module bên dưới nó. Trên máy trạm của tôi, tôi đã phải sử dụng IfDefine! Prod theo sau là IfModule! Expires_module. Điều này đã cho tôi một tệp .htaccess hoạt động trong dev, dàn dựng/thử nghiệm và sản xuất. –

+0

Kinda khó hiểu, làm cho tôi nghĩ rằng các biến môi trường đơn giản có thể được sử dụng trên ifdefine – Dan

1

Đây là một ví dụ đơn giản đó là đủ để bạn có thể thay đổi nó để đáp ứng yêu cầu của bạn:

<IfModule mod_rewrite.c> 
    RewriteEngine On 

    RewriteBase/

    RewriteCond %{HTTP_HOST} !^localhost 
    RewriteCond %{HTTP_HOST} !^www\. 
    RewriteRule (.*) http://www.%{HTTP_HOST}/$1 [R=301,L] 
</IfModule> 
+0

Điều đó có hoạt động bình thường không, sau đó tôi có thể nối thêm một RewriteCond khác bên dưới nó với nhiều mục RewriteRule hơn và nó sẽ chỉ áp dụng cho RewriteCond trước đó? Tôi có nghĩa là, trong ngôn ngữ lập trình bình thường và đánh dấu bạn có một số loại bắt đầu/dừng khối, cho dù đó là niềng răng xoăn. Nhưng không phải ở đây –

+0

Ngoài ra, là RewriteBase/quan trọng? –

+0

Vấn đề với cách tiếp cận này là nó chỉ hoạt động cho RewriteRule, hãy thử và cũng sử dụng nó cho SetEnv hoặc php_value và nó không hoạt động. Đó là lý do tại sao tôi sử dụng bộ lọc IfModule. –

5

Trên Ubuntu Linux, biến những 's IfDefine được thiết lập trong

/etc/apache2/envvars 

và được gọi là APACHE_ARGUMENTS. Vì vậy, ở dưới cùng của tập tin mà tôi đã có thêm:

export APACHE_ARGUMENTS="-D dev" 

... và sau đó trả lại máy chủ với:

/etc/init.d/apache2 stop 
/etc/init.d/apache2 start 

Trên các hệ thống khác:

Tuy nhiên, có một bài viết Debian về chủ đề này thảo luận về điều này here. Trong ví dụ đó, tệp cần chỉnh sửa là/etc/default/apache2 và biến được gọi là APACHE_DEFINES.

Tương tự, trên một số hệ thống, nó là một biến có tên là OPTIONS được đặt trong /etc/sysconfig/httpd.

Vì vậy, những gì bạn thực sự cần làm là tìm phần bắt đầu trong tệp apache2ctl của bạn. Vì vậy, hãy bắt đầu bằng cách thực hiện một số whereis apache2ctl để tìm tập lệnh đó ở đâu, đưa nó ra và tìm phần bắt đầu bằng chỉ thị apache2 trong đó và xem biến có vượt qua không là OPTIONS, APACHE_ARGUMENTS, APACHE_DEFINES hoặc thứ khác. Sau đó, xem tệp nào bạn cần chỉnh sửa bằng thử nghiệm với /etc/sysconfig/httpd, /etc/default/apache2 hoặc /etc/apache2/envvars.