2013-10-13 35 views
6

這裏Nginx的重寫規則是英文的規則:對於笨

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.

我有一個.htaccess文件Apache服務器上正常工作:

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

此規則的一些正確的結果:

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

我嘗試了一些工具來htaccess的規則轉換爲nginx的規則,但所有是不正確的。

通過http://winginx.com/htaccess(缺少資產文件夾中的例外規則...):

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

通過http://www.anilcetin.com/convert-apache-htaccess-to-nginx/(錯誤$ 1的值):

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

我該如何解決這個問題?調試規則真的很難。

這是到目前爲止我的nginx的配置:

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

什麼是您的codeigniter目錄的根路徑和完整路徑? –

回答

10

您可以添加到您的配置:

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

這將與您location /規則正常工作。

你的配置還需要添加根文件和默認索引文件。

... 
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

我可以使用或不使用index.php加載頁面,但仍然無法加載資產文件夾中的文件 – Letomkov

+1

添加'error_log /var/log/nginx/localhost.error_log debug; rewrite_log on;'重新啓動服務器,然後嘗試在資產文件夾中加載文件。告訴我,如果你看到任何錯誤。 – anvoz

+0

我怎麼會得到一個錯誤:'打開()「/ etc/nginx/html/assets/...」失敗(沒有這樣的文件或目錄)'?該規則缺少一些有助於nginx路由到正確的Web目錄? – Letomkov

2

你想這樣做,而不是:

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

$request_uri是由客戶原始的URI請求。如果您希望在其他Nginx重寫規則處理後請求URI請求,那麼您將使用$uri。但是,對於你想要做的事情,事先將是你想要的。

此外,您需要使用反斜槓來轉義特殊的正則表達式字符,如.

+0

這似乎是正確的,但不起作用。下面是一些例子的結果:'example.com' - 404,'example.com/index.php' - OK,'example.com/assets/css/main.css' - 404。是否有我可以調試規則? – Letomkov

+0

@Letomkov用你的Nginx配置文件的內容更新你的問題。 –

+0

我將我的nginx配置文件添加到我的問題中。我試圖替換'location/{...}用你當前的問題來處理,但它不起作用。 – Letomkov

0

請試試這個。這個對我有用。

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; 
    } 
}