2016-11-25 55 views
0

隨着一些(或非常)的試驗和錯誤,我能夠修改我的副本並粘貼nginx fastcgi php配置從幾年前的某個地方能夠運行我的PHP應用程序在子文件夾中。nginx沒有通過fastcgi查詢字符串

但是我不能解決的最後一步是如何讓nginx將查詢字符串傳遞給php,以便能夠訪問GET參數。這是我的配置大多是完美的,只有配置參數丟失:

server { 
    listen  80; 
    server_name project.dev; 

    location /app/ { 
     alias /path/to/my/application/; 
     index index.php; 
     try_files $uri $uri/ /app/index.php; 

     location ~ \.php$ { 
      include fastcgi_params; 
      fastcgi_pass 127.0.0.1:9000; 
      fastcgi_param SCRIPT_FILENAME $document_root/index.php; 
     } 
    } 

    location/{ 
     # configuration for static website 
    } 
} 

我讀了有你要傳遞給try_files不同的選項來獲得請求參數:

  • try_files $uri $uri/ /app/index.php$is_args$query_string;
  • try_files $uri $uri/ /app/index.php$is_args$args;
  • try_files $uri $uri/ /app/index.php?$query_string;

不幸的是將其更改爲任何這些結果在我的PHP腳本不再被人發現,因爲nginx的請求重置爲它的文檔根:

2016/11/25 11:54:48 [error] 45809#0: *1169 open() "/usr/local/Cellar/nginx-full/1.10.2/htmlindex.php" failed (2: No such file or directory), client: 127.0.0.1, server: project.dev, request: "GET /app/myurl?test=works HTTP/2.0", host: "project.dev", referrer: "http://project.dev/app/myurl?test=works" 

提供了一個絕對路徑fastcgi_param SCRIPT_FILENAME不工作太產區同樣的錯誤。即使在server級別上設置root配置也無法正常工作,因爲每次都會省略路徑的分隔斜槓和index.php。但是(如果可能的話)我寧願不在服務器級別設置根目錄,因爲這個項目由文件系統上的許多不同的文件夾和應用程序組成,共享沒有公共目錄。

+0

你想達到什麼目的? '/ path/to/my/application /'下有哪些文件? –

+0

我的完整應用程序保存在'/ path/to/my/application /'下,它的所有資源都是php。加載資產和運行php的工作與預期完全一致,但由於某些原因,我無法將$ _GET參數傳遞給fastcgi –

+0

問題是'別名'和'try_files'。如果'/ path/to/my/application /'以'/ app'結尾(與URI相同的子目錄名稱),那麼您希望在URI'/ app'下運行應用程序, 。 –

回答

0

您的應用程序安裝在/path/to/my/app2/public下,並且想要使用URI /app訪問它。

假設我們可以使用/app2/作爲內部URI(它不會與此服務器提供的任何其他公共URI相沖突 - 但重要的是您的客戶不會看到)。

您有一個PHP文件。

location ^~ /app { 
    rewrite ^/app(.*)$ /app2/public$1 last; 
}   

location ^~ /app2/ { 
    internal; 

    root /path/to/my; 
    index index.php; 

    try_files $uri $uri/ /app2/public/index.php$is_args$args; 

    location ~ \.php$ { 
     include fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_param SCRIPT_FILENAME /path/to/my/app2/public/index.php; 
    } 
} 

第一位置塊只是改變了內部URI相匹配的文檔根(因此我們可以利用根代替別名)。第二個位置塊提供靜態內容。第三個地址區塊調用index.php

index.php如何獲取查詢字符串是程序相關的。它將使用fastcgi_params中定義的參數之一。通常是REQUEST_URI或QUERY_STRING。無論哪種方式,兩個變量應該保留上述配置。

^~修飾符可確保這些位置塊優先於其他正則表達式位置塊(應該存在)。詳情請參閱this document