2017-08-08 111 views
1

我已經花了這個muy tiempo,我無法得到一個解決方案。 我需要一種方法來指向相同的url,但具有不同的根目錄到同一個應用程序。我不想使用重寫,因爲根目錄名稱必須由應用程序處理,並重寫丟棄它。nginx別名和動態目錄名稱

http://www.host.com/a/ --> /var/www/html/project/ 
http://www.host.com/b/ --> /var/www/html/project/ 
http://www.host.com/c/ --> /var/www/html/project/ 

我已經成功在nginx的配置有固定vdirectory一個別名目錄,使Nginx的請求轉發到FastCGI的。

location /vdirectory { 

     alias /var/www/html/project/; 
     try_files $uri $uri/ /vdirectory/index.php; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
     } 
} 

上述工作正常。

由於我不希望使用固定的根目錄的名字,但是任意的,這是我到目前爲止管理:

location ~ ^/(.?)$ { 

     alias /var/www/html/project/; 
     try_files $uri $uri/ /$1/index.php; 
     location ~ \.php$ { 
      fastcgi_pass unix:/var/run/php5-fpm.sock; 
      include fastcgi_params;      
      fastcgi_param SCRIPT_FILENAME $request_filename; 
     } 
} 

不用說,它會返回404這是一個好兆頭因爲這意味着正則表達式已經識別了路徑,但請求沒有正確轉發。

工作配置和錯誤的一個之間的唯一區別是/vdirectory VS ~ ^/(.?)$

回答

2

alias作品不同的正則表達式location塊內部時。詳情請參閱this document。您需要捕獲URI的其餘部分並將其附加到alias值。例如:

location ~ ^/(?<prefix>[^/]+)/(?<name>.*)$ { 
    alias /var/www/html/project/$name; 

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

    location ~ \.php$ { 
     if (!-f $request_filename) { return 404; } 

     fastcgi_pass unix:/var/run/php5-fpm.sock; 
     include fastcgi_params;      
     fastcgi_param SCRIPT_FILENAME $request_filename; 
    } 
} 

我避免使用try_filesalias相同塊內由於long term issues。請參閱this caution關於使用if

+0

是的。這就是我一直在尋找的。獲得如此精確的解決方案非常罕見。太感謝了 –