2016-06-28 54 views
2

某些PHP網址正在下載,而不是由Nginx執行。我有一個現有的Web應用程序運行良好。我的任務是在主應用程序的文件夾中添加其他已安裝的應用程序。每個應用程序都有自己的前端控制器index.php腳本。nginx將一些PHP網址作爲下載而不是執行

對於此設置,我在$document_root/app內創建了符號鏈接,符號鏈接指向包含index.php前端控制器的文件夾。

當我導航到大多數URL時,一切正常,主應用程序前端控制器被執行,我得到預期的結果。當我導航到一個不存在的應用程序時,我從nginx獲得404 Not Found,這是預期的。但是,當我導航到其中一個應用程序時,瀏覽器會下載應用程序前端控制器。

root     /my/web/root; 

location/{ 
    try_files   $uri 
         /$server_name$uri 
         /shared$uri 
         /index.php$is_args$args; 
} 

location ~ [^/]\.php(/|$) { 
    disable_symlinks off; 
    fastcgi_split_path_info ^(.+\.php\b)(.*)$; 
    fastcgi_param  SERVER_NAME $host; 
    fastcgi_param  PATH_INFO $fastcgi_path_info; 
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_param  SCRIPT_NAME /index.php; 
    fastcgi_index  index.php; 
    include    fastcgi.conf; 
    fastcgi_pass  php-fpm; 
} 

location ~ ^/app/([a-z-]+)(/.*)?$ { 
    try_files   $uri 
         /app/$1/index.php$is_args$args 
         =404; 
} 

URL觸發下載:/app/my-app/(存在)
URL其中404:/app/foo/(不存在)
URL,其執行:/foo

+0

試着設置php的位置到'location〜[^ /] \。php(/ | $)' –

+0

同樣的結果.... –

回答

2

.php文件需要由0處理塊。你有一個通用的文檔根,這使得事情變得更簡單。

然而,look at this document關於location指令。

您將看到正則表達式位置被認爲是,其順序爲,第一個匹配位置將用於處理請求。

總之,你需要把location ~ [^/]\.php(/|$)之前的任何其他衝突的正則表達式的位置,如果你希望你.php文件被正確處理。

+0

行爲沒有變化。顯式的'.../app/index.php' URL執行,隱式的'.../app /'URL下載,非應用程序URL執行。 –

+3

您在上次的'try_files'指令中有錯誤。刪除'= 404'。 '/ app/$ 1/index.php $ is_args $ args'元素必須是最後一行。有關詳細信息,請參見[本文檔](http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files)。 –

+1

更多關於爲什麼'= 404'打破的事情:[try_files](http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files)在當前上下文中「從列表中找到第一個找到的文件」 」。對於'/ app/my-app'來說,這個上下文是位置〜^/app /([az - ] +)(/.*)$'block,它不處理PHP - 所以nginx發出原始'/ app/my-app/index.php'源文件。但是,try_files列表中的最後一項是*重定向到*。當'/ app/$ 1/index.php'是最後一個時,它被重定向到'location〜[^ /] \。php(/ | S)'塊,它處理PHP - 所以在刪除'= 404'後,我的應用程序前端控制器運行。 –

相關問題