2011-11-24 12 views
5

Tôi đã cài đặt máy chủ Apache2 (cộng với PHP & MySQL) và bật cấu hình aptrong cấu hình apache. Tôi đã thêm tệp .htaccess để xóa index.php khỏi url như được mô tả trong wiki CodeIgniter.Rewriterule cho CodeIgniter không hoạt động

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

Tôi đã đặt tệp này vào thư mục gốc của trang web.

Khi tôi cố gắng truy cập url mydomain.local/index.php/welcome thì tôi sẽ nhận được trang mặc định của CodeIgniter. Nhưng khi tôi cố gắng truy cập cùng một trang thông qua mydomain.local/welcome thì tôi nhận được trang 404.

Làm cách nào để kiểm tra xem quy tắc ghi đè toàn bộ có hoạt động không? Và tại sao nó không hoạt động?

Trả lời

9

Tôi đã tìm thấy giải pháp. Tệp htaccess không được phép chạy bởi cấu hình Apache. Vì vậy, tôi đã phải đặt cờ AllowOverride trên thư mục đến AllowOverride ALL.

Cảm ơn tất cả trợ giúp!

+3

cảm ơn ... đã giải quyết chính xác sự cố của tôi – hforbess

0

bạn cần phải loại bỏ các index.php từ trang index trong file config

/application/config/config.php

$config['index_page'] = ''; 

Cố gắng thứ .htaccess này, nó là những gì tôi 'm using:

RewriteEngine on 
RewriteCond $1 !^(index\.php|resources|robots\.txt) 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php/$1 [L,QSA] 

Bạn cũng có thể cần bật mod_rewite trong cấu hình apache của mình.

+0

Đã xóa tệp khỏi tệp nhưng vẫn không hoạt động. :( –

+0

Không hoạt động :(Không có cách nào để kiểm tra xem toàn bộ tập tin .htaccess có đang được thực thi không? –

9

Giả sử rằng cấu hình của bạn (/application/config/config.php) có index_page khuyết tật:

$config['index_page'] = ''; 

Và Apache của bạn DocumentRoot là: /srv/www/

Tạo một tệp tin .htaccess ở cùng cấp với thư mục /application/ của bạn, với nội dung sau:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteBase/

    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
</IfModule> 

Bạn nên chú ý rằng RewriteBase điểm đến DocumentRoot (/). Nếu số index.php nằm trong một thư mục khác, bạn nên thay đổi RewriteBase tương ứng.

Đối với một cấu trúc thư mục như:

/srv/www/application/ 
/srv/www/system/ 
/srv/www/index.php 
/srv/www/.htaccess 

bạn RewriteBase nên là: /

Đối với một cấu trúc thư mục như:

/srv/www/codeigniter/application/ 
/srv/www/codeigniter/system/ 
/srv/www/codeigniter/index.php 
/srv/www/codeigniter/.htaccess 

RewriteBase bạn nên : /codeigniter/

Và như vậy, bạn sẽ có được hình ảnh.

0

Thử thay đổi cài đặt cấu hình uri_protocol. Ngoài ra, một số máy chủ yêu cầu sửa đổi này trong tệp htaccess:

RewriteRule ^(.*)$ /index.php/?$1 [L] 

Dấu chấm hỏi sau dấu gạch chéo cuối cùng. Hãy thử điều đó.

Đồng thời đảm bảo mod_rewrite của bạn được bật.

+0

Mod_rewrite bật và được tải dựa trên thông tin phpinfo().Tôi thực sự bắt đầu tự hỏi nếu toàn bộ mod viết lại đang hoạt động ... –

+0

Hm, nó có viết lại bất cứ điều gì không? Làm một số xét nghiệm, ngay cả bên ngoài CI, sau đó bạn sẽ có thể địa phương hóa vấn đề. – Shomz

1

Mặc định .htaccess (từ ci userguide http://ellislab.com/codeigniter/user-guide/general/urls.html)

RewriteEngine on 
RewriteCond $1 !^(index\.php|images|robots\.txt) 
RewriteRule ^(.*)$ /index.php/$1 [L] 

Tôi đã nhầm lẫn trên mã cho một khoảnh khắc, nhưng tôi có mã như thế này:

RewriteEngine on 
RewriteCond $1 !^(index\.php|robots\.txt|.*\.css|.*\.js|.*\.png) 
RewriteRule ^(.*)$ ./index.php/$1 [L] 

On localhost bạn phải thêm"./"ở phía trước của index.php (dòng thứ ba) vì trong trường hợp của tôi, thư mục ci không được đặt trên thư mục gốc. Tôi nghĩ rằng "./" có nghĩa là cần phải tương đối đường dẫn. Đối với điều kiện bổ sung ".*\.css|.*\.js|.*\.png", nó có nghĩa là apache không nên viết lại trên tập tin với phần mở rộng css, js và png.

0

Nếu bạn đang gặp phải 500 Internal Server Error. Nơi đầu tiên tìm kiếm là tệp apache error.log. Đối với tôi, lỗi có liên quan đến lệnh AddOutputFilterByType.

Lệnh không hợp lệ 'AddOutputFilterByType', có lẽ sai chính tả hoặc được xác định bởi mô-đun không có trong cấu hình máy chủ.

Đối với cấu hình của tôi, hai mô-đun không được bật trong cấu hình apache, trong khi các lệnh tương ứng đã được sử dụng trong .htaccess. Vì vậy, một khi tôi đã bật filter_module và tất cả mọi thứ đã trở lại bình thường deflate_module.