Nginx别名与laravel4

时间:2014-01-24 12:10:05

标签: php nginx laravel-4

laravel的我的nginx配置

 server {
        listen          80;
        server_name     app.dev;
        rewrite_log     on;
        root            /var/www/l4/angular;
        index         index.html;

        location /{
        # URLs to attempt, including pretty ones.
            try_files   $uri $uri/ /index.php?$query_string;

        }
        location /lara/ {
          index index.php;
          alias /var/www/l4/public/;
        }
        # Remove trailing slash to please routing system.
        if (!-d $request_filename) {
            rewrite     ^/(.+)/$ /$1 permanent;
        }
        location ~ ^/lara/(.*\.php)$ {
              alias /var/www/l4/public/$1;
                      fastcgi_pass unix:/var/run/php5-fpm.sock;
                      fastcgi_index index.php;
                      fastcgi_param SCRIPT_FILENAME    $document_root$fastcgi_script_name;
                      include fastcgi_params;
        }
    }

Laravel路线:

Route::get('/', function()
{
    return View::make('index');
});

Route::get('x', function()
{
    return "alpha";
});

我的问题是,“http://app.dev/lara/index.php”正在运行,但“http://app.dev/lara”并且lara / x无效。

1 个答案:

答案 0 :(得分:5)

简而言之,进行以下编辑。下面解释原因。

替换

try_files   $uri $uri/ /index.php?$query_string;

try_files   $uri $uri/ /lara/index.php?$query_string;

用此

替换最后一个位置指令
location ~ /lara/(.*)$ {
                  fastcgi_pass unix:/var/run/php5-fpm.sock;
                  fastcgi_index index.php;

                  include fastcgi_params;
                  fastcgi_param SCRIPT_FILENAME "/var/www/l4/public/index.php";
                  fastcgi_param REQUEST_URI /$1;
}

重新启动nginx。

现在为什么。我发现你的nginx配置有几个错误。首先,/index.php?$query_string指令中的try_files应为/lara/index.php?$query_string,否则nginx会尝试将http://app.dev/lara作为/var/www/l4/angular/index.php?的请求,这不会导致任何地方(除非你有一个index.php,甚至它将作为文本提供,而不是通过fpm)。

第二个与location ~ ^/lara/(.*\.php)$指令有关。我认为将其限制为以.php结尾的URI是错误的,因为它不适用于http://app.dev/lara/x,这将使nginx仅搜索/var/www/l4/public/x,当然返回404。将正则表达式更改为^/lara/(.*)$应该可以捕获/lara/x。现在fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;指令是错误的,因为对于http://app.dev/lara/xSCRIPT_FILENAME/var/www/l4/public/x/lara/x,并且删除别名指令中的$1将不会更好。相反,像这样fastcgi_param fastcgi_param SCRIPT_FILENAME "/var/www/l4/public/index.php";,删除别名指令,它现在没用,然后将include fastcgi_params;移到fastcgi_param之上,这样就不会覆盖SCRIPT_FILENAME }值。

完成?还没 :)。尝试/lara/x会显示Laravel路由错误,因为它会尝试查找路由lara/x而不是x,这是因为您要包含fastcgi_params。只需在fastcgi_param REQUEST_URI /$1; param指令后添加SCRIPT_FILENAME即可。现在它应该工作正常。别忘了重新启动nginx :)。