2010-03-23 43 views
11

Trong bootstrap.php của tôi, tôi đã điều sau đây:Kohana3: .htaccess RewriteBase khác nhau và Kohana BASE_URL cho dev và sản xuất môi trường

if($_SERVER['SERVER_NAME'] == 'localhost') 
    Kohana::$environment = 'development'; 
else 
    Kohana::$environment = 'production'; 

... 

switch(Kohana::$environment) 
{ 
    case 'development': 
     $settings = array('base_url' => '/kohana/', 'index_file' => FALSE); 
     break; 

    default: 
     $settings = array('base_url' => '/', 'index_file' => FALSE); 
     break; 
} 

Trong .htaccess có điều này:

# Installation directory 
RewriteBase /kohana/ 

Điều này có nghĩa rằng nếu tôi chỉ tải lên ứng dụng kohana của tôi, nó sẽ phá vỡ vì RewriteBase trong tệp .htaccess sẽ sai. Có cách nào tôi có thể có một điều kiện trong các tập tin .htaccess tương tự như một trong tôi có trong bootstrap để nó sẽ sử dụng RewriteBase chính xác?

Trả lời

9

Tôi không nghĩ rằng có cách để có điều kiện RewriteBase. Cách duy nhất trong Apache mà nói đến cái tâm là đặt chỉ thị RewriteBase vào một thẻ <Location> nhưng chỉ có sẵn trong httpd.conf chính nó, không phải trong tệp .htaccess.

Điều tôi thường làm trong những trường hợp này là xác định AccessFileName khác trong môi trường địa phương, ví dụ htaccess.txt. Tệp đó sẽ chứa các quy tắc ghi lại cục bộ, trong khi .htaccess chứa các quy tắc bên máy chủ.

+0

Thông minh rằng người cuối cùng ở đó ... Tôi có đặt AccessFileName trong httpd.conf không? Tôi có thể đặt chúng cho mỗi máy chủ ảo không? – Svish

+0

@Svish theo hướng dẫn, vâng. –

+6

AccessFileName thực sự hỗ trợ nhiều hơn một tên tập tin, vì vậy tôi có thể chỉ cần thêm như sau: 'AccessFileName local.htaccess .htaccess' và các tập tin .htaccess thông thường sẽ vẫn hoạt động :) – Svish

5

Tôi đã chạy qua điều này trong khi tìm kiếm giải pháp tương tự. Trong khi tôi không nhận được RewriteBase để thiết lập có điều kiện, tôi đã nhận được một hiệu ứng tương tự bằng cách thiết lập một biến môi trường và sử dụng nó trong các quy tắc sau đây. Đây là một ví dụ về ý tôi.

# Set an environment variable based on the server name 
RewriteRule %{SERVER_NAME} localhost [E=REWRITEBASE:/local_dir/] 
RewriteRule %{SERVER_NAME} prodhost [E=REWRITEBASE:/prod_dir/] 

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{ENV:REWRITEBASE}%{REQUEST_FILENAME} !-f 
RewriteCond %{ENV:REWRITEBASE}%{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_URI} !^static 

# Rewrite all other URLs to index.php/URL 
RewriteRule .* %{ENV:REWRITEBASE}index.php/$0 [PT] 
+0

Thú vị ... không chắc chắn tôi nhận được những gì sẽ xảy ra ở đó mặc dù: p – Svish

+0

Vâng thư mục cơ bản mà tôi thường sẽ đặt RewriteBase để nhận được lưu vào một biến môi trường ($ REWRITEBASE). Trong RewriteCond và RewriteRule, biến đó được mở rộng và được thêm tiền tố vào kết quả. Ví dụ - nếu server_name là localhost, RewriteRule sẽ trở thành. * /local_dir/index.php$0 [PT]. – mozillalives

+0

Tôi cũng nên lưu ý rằng đây là trên Apache 2.2. Tôi không chắc chắn làm thế nào các phiên bản trước đó sẽ xử lý này. – mozillalives

2

Nếu tập tin htaccess của bạn là ở cơ sở lắp đặt (tức là bên cạnh index.php), sau đó bạn không đặc biệt cần RewriteBase, tôi rời khỏi nó ra khỏi ứng dụng của tôi và họ làm việc đẹp. Ngay cả với hai cài đặt Kohana, một cài đặt bên trong thư mục khác.

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