最近在試着用nginx+symfony搭建公司的網站,因爲nginx不支持pathinfo模式,因此必須修改nginx(我使用的是nginx1.5.1)的配置文件/etc/nginx/config.d/default.conf以使其在邏輯上支持url邏輯路徑到物理路徑的映射,如下爲個人default.conf文件內容:php
1 server { 2 listen 80; 3 server_name localhost; 4 location / { 5 root /usr/share/nginx/html/symfony/web; 6 index index.html index.htm index.php; 7 } 8 location ~ ^(.+\.php)(.*)$ { 9 root /usr/share/nginx/html/symfony/web; 10 fastcgi_index index.php; 11 fastcgi_split_path_info ^(.+\.php)(.*)$; 12 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 13 fastcgi_param PATH_INFO $fastcgi_path_info; 14 fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; 15 fastcgi_pass 127.0.0.1:9000; 16 include fastcgi_params; 17 }
18}
實現url的邏輯映射後,就能夠在網頁中看到實際效果了(注意圖中被圈部分):
html
可是,若是在prod模式下(即訪問192.168.10.133/app.php/下的路徑)時,提示出錯「no route for get / ",這並非咱們的pathinfo配置出了問題(剛開始從這個方面着手,費老勁了),而是由於symfony2並無爲咱們提供prod模式下的內容,咱們須要修改symfony/app/routing.yml文件本身給他提供一個邏輯路徑映射,以下爲我從routing_dev.xml文件中拷過來的一個配置項: nginx
1 # AcmeDemoBundle routes (to be removed) 2 _acme_demo: 3 resource: "@AcmeDemoBundle/Resources/config/routing.yml"
這樣symfony就會在prod模式下就能夠經過url邏輯映射獲得src/Acme/DemoBundle/Resources/config/routing.yml文件(其內容以下所示),經過這個文件就能夠找到@AcmeDemoBundle/Controller/DemoController.php文件從而顯示出如上圖所顯示的效果了 web
1 _demo: 2 resource: "@AcmeDemoBundle/Controller/DemoController.php" 3 type: annotation 4 prefix: /demo
可是,實際訪問http://192.168.10.133/app.php/demo/hello/bean時,並無顯示出指望的效果,這時候又報了一個錯誤:
Cannot import resource "/usr/share/nginx/html/symfony/src/Acme/DemoBundle/Resources/config/config.yml" from "/usr/share/nginx/html/s
ymfony/app/config/config.yml".
app
網上搜了下,stackoverflow上給的答案大部分是讓你在resource字段前面要縮進四個字符之類的,對個人問題不適用,後來發如今上面出錯信息的後面還有一行字說要在AppKernel.php中註冊AcmeDemoBundle之類的,因而找到/usr/share/nginx/html/symfony/app/AppKernel.php,發現有以下一句話: 網站
1 if (in_array($this->getEnvironment(), array('dev','test'))) { 2 $bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); 3 $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 4 $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); 6 $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); 7 }
至此,大功告成,咱們只須要修改
array('dev','test')爲array('dev','test','prod')便可,這樣symfony就會在prod模式下也註冊AcmeDemoBundle了,實驗結果顯示以下:
this
本文系原創,轉載請註明出處:http://www.cnblogs.com/beanmoon/p/3181733.htmlurl