2013-10-28 70 views
0

我嘗試了nginx並將我現有的apache配置移植到nginx。我設法成功地重新路由代碼字網址,但是我遇到了一個特定控制器的問題,其名稱與站點根目錄中的目錄一致。nginx codeigniter重寫:控制器名稱與目錄衝突

我設法讓我的笨URL的工作,因爲它在Apache中那樣,只是,我有一個特定的URL說http://localhost/hello與在網站根hello目錄一致。 Apache對此沒有任何問題。但是nginx路由到這個目錄而不是控制器。

我重路由結構如下

http://host_name/incoming_url => http://host_name/index.php/incoming_url 

所有的笨文件都在網站根目錄。

我的nginx的配置(相關部分)

server { 

listen 80; ## listen for ipv4; this line is default and implied 
#listen [::]:80 default ipv6only=on; ## listen for ipv6 

root /path/to/site/root; 
index index.php index.html index.htm; 

# Make site accessible from http://localhost/ 
server_name localhost; 

location/{ 
    # First attempt to serve request as file, then 
    # as directory, then fall back to index.html 

    index index.php index.html index.htm; 

    try_files $uri $uri/ /index.php/$request_uri; 

    #apache rewrite rule conversion 

    if (!-e $request_filename){ 
     rewrite ^(.*)/?$ /index.php?/$1 last; 
    } 

    # Uncomment to enable naxsi on this location 
    # include /etc/nginx/naxsi.rules 
} 

location ~ \.php.*$ { 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini 

    # With php5-cgi alone: 
    fastcgi_pass 127.0.0.1:9000; 
    # With php5-fpm: 
    #fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_index index.php; 
    include fastcgi_params; 
} 

我是新來的nginx的,我需要找出與控制器名稱此目錄衝突的幫助。我從網絡中的各種來源獲得了這種配置,並且我非常讚賞任何更好的書寫配置的方式。

回答

2

你的問題是,你告訴nginx的將它傳遞給主控制器之前檢查該文件夾是否存在

try_files $uri ($uri/) /index.php/$request_uri; 
       | 
      this part 

你可以簡單地告訴nginx的不找的文件夾修復它,只是通過去除部分

try_files $uri /index.php/$request_uri; 

PS$request_uri已經包含了領先/

check the wiki link

所以更正確的方法是做

try_files $uri /index.php$request_uri; 

PS#2

#apache rewrite rule conversion 

if (!-e $request_filename){ 
    rewrite ^(.*)/?$ /index.php?/$1 last; 
} 

這部分應該被刪除,try_files聲明已經處理了這一部分,究竟一樣。

我也相信你的網站將刪除這一行太

fastcgi_index index.php; 

後仍能正常工作,這

fastcgi_split_path_info ^(.+\.php)(/.+)$; 

我從來沒有真正使用這些。

而你的配置缺少root,我想這就是爲什麼你需要這些線。

編輯:

至於你提到如果重寫被刪除的網站不能正常工作,我注意到還有的try_filesrewrite語句之間的細微差別,我們需要修復的try_files做同樣的事情,該做rewrite,所以它會從這個

try_files $uri /index.php$request_uri; 

更改爲此

try_files $uri /index.php/?$request_uri; 

之後,重寫應該可以刪除。

+0

嗨。感謝回覆。但我嘗試了所有上述建議,並刪除'$ url /'部分根本不起作用。給我一個拒絕訪問。另外我在服務器指令中有一個'root'。在位置指令中是否也需要它?並刪除if塊if(! - e $ request_filename)..'也導致'訪問被拒絕的消息'我是nginx的新手,配置主要來自各種來源。請指向正確的方向。 – palerdot

+0

通過access denied你的意思是一個403禁止的錯誤? –

+0

沒有。在整個頁面中只有一行訪問被拒絕。刪除'fastcgi_split_path_info ^(。+ \。php)(/.+)$;'如你所說的那樣工作,並且在配置文件中沒有任何作用。但刪除'if(!-e $ request_filename){^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ }'部分讓事情變得不合時宜。 – palerdot