2015-12-21 48 views
1

我拉出我的頭髮試圖獲得以下安裝在自己的機器上的Heroku和工作:如何通過相同的PHP文件提供來自子路徑的所有請求?

  • 主網頁是駐留在文檔根
  • root/api下一個API PHP文件。所有到/api/*的請求應該被轉發到它的網關文件(api/index.php)。

本地我得到了這個工作與不同的conf文件(下面),但在Heroku上沒有任何工作正常。我能找到的最好的是:

location/{ 
    try_files $uri $uri/ /index.php?$query_string; 
    index index.php; 
} 
location ~ ^/api/(.+) { 
    try_files /api/index.php /api/index.php; 
} 
location ~ \.php(/|$) { 
    try_files @heroku-fcgi @heroku-fcgi; 
} 

如果我嘗試使用重寫,它會抱怨無限循環。如果我嘗試將網關腳本設置爲index並使用try_files及其FCGI位置,則會得到404 - 因爲除了該腳本以外,/api文件夾下沒有任何內容。
使用try_files並直接指向腳本使Heroku直接發送.php文件下載,而不是解釋它。我怎樣才能解釋,並仍然覆蓋所有其他/api/*請求?


的conf文件我的本地機器上工作:

server { 
    listen  80; 
    server_name devshop.dev; 

    index index.php; 
    root /home/myself/dev/developer-shop/www/; 

    location ~ ^/api(/|$) { 
     try_files $uri $uri/ /api/index.php; 
     include  /etc/nginx/fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    } 

    location ~ \.php(/|$) { 
     include  /etc/nginx/fastcgi_params; 
     fastcgi_pass 127.0.0.1:9000; 
     fastcgi_index index.php; 
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
     fastcgi_split_path_info ^(.+\.php)(/.*)$; 
    } 
} 

回答

0

在本地機器上的PHP腳本,由各自的位置塊內處理。在您的目標機器上,/api/位置執行內部重寫,然後預計由php塊處理。

正則表達式位置塊的排列順序是/api/index.php一直跟着/api/位置塊 - 因此是重定向循環。

無論反向正則表達式位置塊的順序或更簡單地,使用前綴位置塊具有重寫:

location /api { 
    rewrite^/api/index.php; 
} 

詳見this document

相關問題