2013-10-13 18 views
6

Đây là quy tắc trong tiếng Anh:Nginx viết lại quy tắc cho CodeIgniter

Any HTTP request other than those for index.php, assets folder, files folder and robots.txt is treated as a request for your index.php file.

Tôi có một file .htaccess mà làm việc một cách chính xác trên Apache server:

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

Một số kết quả chính xác cho quy tắc này:

example.com = example.com/index.php

example.com/index.php/welcome = example.com/welcome

example.com/assets/css/main.css! =example.com/index.php/assets/css/main.css

tôi đã cố gắng một số công cụ để chuyển đổi từ quy tắc htaccess để nginx quy tắc nhưng tất cả đều không chính xác.

Via http://winginx.com/htaccess (thiếu các quy tắc ngoại lệ cho thư mục tài sản ...):

location/{ rewrite ^(.*)$ /index.php/$1 break; } 

Via http://www.anilcetin.com/convert-apache-htaccess-to-nginx/ (lỗi trong $ 1 giá trị):

if ($1 !~ "^(index.php|assets|files|robots.txt)"){ 
    set $rule_0 1$rule_0; 
} 
if ($rule_0 = "1"){ 
    rewrite ^/(.*)$ /index.php/$1 last; 
} 

Làm thế nào tôi có thể sửa lỗi này? Rất khó để gỡ lỗi quy tắc.

Đây là nginx cấu hình của tôi cho đến nay:

server { 
    listen  80; 
    server_name www.example.com example.com; 

    location/{ 
     try_files $uri $uri/ /index.php?/$request_uri; 
    } 

    location ~ \.php$ { 
     root   html; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name; 
     include  fastcgi_params; 
    } 

    location ~ /\.ht { 
     deny all; 
    } 
} 
+0

Đường dẫn gốc của bạn và đường dẫn đầy đủ với thư mục trình mã hóa của bạn là gì? –

Trả lời

10

Bạn có thể thêm video này vào cấu hình của bạn:

location ~* ^/(assets|files|robots\.txt) { } 

này sẽ làm việc một cách chính xác với quy tắc location / của bạn.

Cấu hình của bạn cũng cần phải thêm tài liệu gốc và tệp chỉ mục mặc định.

... 
root /ftp/wardrobe; 
index index.php index.html index.htm; 

location/{ 
    try_files $uri $uri/ /index.php?/$request_uri; 
} 

location ~* ^/(assets|files|robots\.txt) { } 
... 
+0

Tôi có thể tải trang có hoặc không có index.php nhưng vẫn không thể tải tệp trong thư mục nội dung – Letomkov

+1

Thêm 'error_log /var/log/nginx/localhost.error_log debug; rewrite_log on; 'vào cấu hình của bạn, khởi động lại máy chủ sau đó thử tải một tập tin trong thư mục tài sản. Cho tôi biết nếu bạn thấy bất kỳ lỗi nào. – anvoz

+0

Làm cách nào tôi có thể gặp lỗi: 'open()"/etc/nginx/html/assets/... "không thành công (Không có tệp hoặc thư mục nào)'? Quy tắc thiếu một cái gì đó giúp tuyến đường nginx để sửa thư mục web? – Letomkov

2

Bạn muốn làm điều này thay vì:

if ($request_uri !~ ^/(index\.php|assets|files|robots\.txt)) { 
    rewrite ^/(.*)$ /index.php/$1 last; 
} 

$request_uri là dành cho các yêu cầu URI gốc của khách hàng. Nếu bạn muốn yêu cầu URI SAU các quy tắc viết lại Nginx khác đã xử lý nó thì bạn sẽ sử dụng $uri. Tuy nhiên, đối với những gì bạn đang cố gắng để làm trước sẽ là một trong những bạn sẽ muốn.

Ngoài ra, bạn cần phải thoát khỏi các ký tự biểu thức chính quy đặc biệt như . bằng cách sử dụng dấu gạch chéo ngược.

+0

Có vẻ như chính xác nhưng không hoạt động. Dưới đây là kết quả của một số trường hợp: 'example.com' - 404,' example.com/index.php' - OK, 'example.com/assets/css/main.css' - 404. Có cách nào tôi có thể gỡ lỗi quy tắc? – Letomkov

+0

@Letomkov cập nhật câu hỏi của bạn với nội dung của tệp cấu hình Nginx của bạn. –

+0

Tôi đã thêm tệp cấu hình nginx của mình vào câu hỏi của mình. Tôi đã cố gắng thay thế 'vị trí/{...} 'quy tắc với câu hỏi hiện tại của bạn nhưng nó không hoạt động. – Letomkov

0

Hãy thử điều này. Nó làm việc cho tôi.

server { 
    server_name domain.tld; 

    root /var/www/codeignitor; 
    index index.html index.php; 

    # set expiration of assets to MAX for caching 
    location ~* \.(ico|css|js|gif|jpe?g|png)(\?[0-9]+)?$ { 
     expires max; 
     log_not_found off; 
    } 

    location/{ 
     # Check if a file or directory index file exists, else route it to index.php. 
     try_files $uri $uri/ /index.php; 
    } 

    location ~ \.php$ { 
     try_files $uri =404; 
     fastcgi_split_path_info ^(.+\.php)(/.+)$; 
     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     include fastcgi_params; 
    } 
} 
Các vấn đề liên quan