2015-11-19 34 views
0

我試圖設置一個nginx環境,其中遺留代碼和新的MVC風格的代碼可以共存,這樣我就可以逐頁地逐頁重構它。遺留代碼需要PHP的舊版本(它在5.3版本上運行得最好,但我編譯時遇到了問題,所以我使用了5.4並修復了任何可能會中斷的內容),但它很容易通過URL區分,因爲它具有文字文件名如http://sub.domain.com/search.php?category=4等,而不是像http://sub.domain.com/search/category/4這樣的新款式 - 主要區別在於.php的存在。兩個版本的PHP的Nginx配置

新的代碼運行正常,在nginx的配置如下:

server { 
    listen 80; 
    server_name *.myproject.dev; 
    root /var/www/myproject/public; 
    index index.php index.html index.htm; 
    try_files $uri $uri/ @rewrite; 
    location @rewrite { 
    rewrite ^/(.*)$ /index.php?_url=/$1; 
    } 
    location ~ ^(.+\.php)(/.*)?$ { 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    include fastcgi_params; 
    } 
} 

(我承認我不完全理解所有的代碼 - 它從各種指南和這樣來了。)

this great tutorial的幫助下,我在它自己的位置上編譯並安裝了PHP 5.4,它監聽端口9001.它對舊代碼使用單獨的域可以很好地工作,但我想要做的是使用單個域,但是調用舊如果在URL中找到.php,則在代碼中進行必要的重寫並使用新代碼。我發現this post on ServerFault並試圖結合其思想在我的情況是這樣的:

server { 
    listen 80; 
    server_name *.myproject.dev; 
    root /var/www/myproject/public; 
    index index.php index.html index.htm; 
    try_files $uri $uri/ @rewrite; 
    location @rewrite { 
    rewrite ^/(.*)$ /index.php?_url=/$1; 
    } 
    location ~ ^(.+\.php)(/.*)?$ { 
    fastcgi_param PATH_INFO $fastcgi_path_info; 
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    fastcgi_pass unix:/var/run/php5-fpm.sock; 
    fastcgi_split_path_info ^(.+\.php)(/.+)$; 
    include fastcgi_params; 

    # Anything with ".php" is directed to the old codebase 
    location ~* \.php { 
     root /var/www/myproject/oldcode; 
     fastcgi_pass 127.0.0.1:9001; 
    } 
    } 
} 

但重寫增加index.php到新的代碼,所以到了最後,一切.php測試,這是不是意圖相匹配。我試着在文件的最後四行中添加了幾個變體,但這並沒有幫助(無論是空白頁面還是僅去舊代碼位置,具體取決於細節)。是否有人對nginx配置語法有足夠的瞭解以幫助我重新排列它,以便它能做到我想要的?

回答

0

如果你的新代碼只使用/index.php,沒有任何PATH_INFO,你可以使用一個前綴位置:

location ^~ /index.php { ... } 
location ~* \.php { ... } 

的第一個位置的優先級由於^~運營商。或者完全匹配(也是優先):

location = /index.php { ... } 
location ~* \.php { ... } 
+0

唉!我現在有一個更大的問題。在嘗試其他任何事情之前,我必須重新啓動虛擬機(自安裝PHP 5.4以來第一次),現在我的主PHP(使用套接字的那個)不再工作了! Nginx只是提供源文件作爲下載。它在一年中運行良好,顯然我在安裝5.4版本時遇到了與原始啓動過程混淆的問題。由於我不太瞭解套接字,我嘗試將其更改爲TCP端口9000,但這沒有幫助。獲得OT和sysadmin-ish - 我應該在Serverfault上發佈嗎? – OsakaWebbie

+0

@OsakaWebbie這聽起來像一個服務器故障主題。在同一個虛擬機上運行兩個版本的PHP當然是冒險的。也許解決方案是兩個虛擬機。 –

+0

這個想法是單個域,因爲我想在繼續運行遺留代碼的同時逐漸開發新代碼,並且內部鏈接需要是相對的(無域名)才能實現可移植性。兩人在同一臺服務器上愉快地跑步,直到我重新啓動,所以我認爲這是有希望的。在上個星期,關於nginx的問題比在Serverfault上的問題多3倍,所以我先在這裏試了一下,但問題現在轉變得離編程越來越遠...... – OsakaWebbie