Laravel + AngularJS Nginx 路由

Posted

技术标签:

【中文标题】Laravel + AngularJS Nginx 路由【英文标题】:Laravel + AngularJS Nginx routing 【发布时间】:2017-06-11 02:22:41 【问题描述】:

我有以下问题, 我需要配置 nginx,所以在任何 URL 用户访问时,它将保留 uri(例如 domain.com/some/url/),但仅传递给 laravel / 并让 Angular 处理路由。

Route::get('/', function()
   return view('index');
);

当访问 /api/anything 时,Laravel 将启动。

现在我从公用文件夹返回index.html,直到找到解决方案 这是我的配置:

location / 
    index index.html;
    try_files $uri $uri/ /index.html;

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

我知道我可以制定如下路线:

Route::get('anything?', function()
    return view('index');
);

但是太宽泛了。

更新:

location / 
    rewrite ^/(.*)$ / break;
    index index.php;
    try_files $uri $uri/ /index.php;

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

【问题讨论】:

您是否正在寻找 NGINX 对所有请求执行 index.blade.php 脚本?如果是这样,您需要配置 fastcgi。 我有 fastcgi,问题不在于如何处理 php 文件,而在于如何从 laravel 始终返回 / 路由但保留 URI 用于 angular 您可以使用简单的重写规则剥离 URL:rewrite ^/(.*)$ / last; @FaisalMemon 我应该把它放在哪里?我尝试过重定向周期。 对不起,把'last'改成'break'。它应该放在您希望它执行的位置。 【参考方案1】:

您无法通过简单的重写来实现您的目标。 Laravel 总是知道真正的URI

关键是你需要用一个路由来处理所有的请求。 Laravel 使用 $_SERVER['REQUEST_URI'] 变量进行路由,并从 fastcgi 传递给 Laravel。变量REQUEST_URI 设置在来自nginx 的$request_uri 变量的fastcgi_params 文件中:

fastcgi_param  REQUEST_URI        $request_uri;

所以你需要将REQUEST_URI 作为/ 传递给Laravel 来处理请求/bla/bla,因为它是/

只需在配置中添加一行:

location ~ \.php$ 
    # now you have smth like this
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;

    # add the following line right after fastcgi_params to rewrite value of the variable
    fastcgi_param  REQUEST_URI       /;

如果您也有/api/,则需要对该行进行一些编辑:

set $request_url $request_uri;
if ($request_uri !~ ^/api/(.*)$ ) 
    set $request_url /;

fastcgi_param  REQUEST_URI $request_url;

Nginx 警告 if 是一个邪恶,这只是第一个想法。

总结一下:

/ 转到 Laravel / 路由。

/api/* 转到 Laravel api 路由。

另一个请求转到 Laravel / 路由。

【讨论】:

很好,但这也破坏了我的api routes。他们都有前缀/api/ 所以你有 / 用于 Angular 和 /api/(.*) 用于 api。好的,检查更新。 谢谢你的作品,但你认为这个解决方案更好还是只创建一个带有任何 url 的 laravel 路由? 我更喜欢 Laravel 路由。你可以在这里阅读它(laravel5 的答案) - ***.com/questions/13297278/… P.S.有一个肮脏的解决方法 - 在不更改 nginx 的情况下删除 / 的 Laravel 路由并将您的视图放置到 resources/views/errors/404.blade.php。所以api 调用将转到api,任何其他请求将转到此视图。它只是给出 404 错误标头:)

以上是关于Laravel + AngularJS Nginx 路由的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AngularJs 处理 Laravel 路由?

AngularJS + Laravel 5 请求返回未定义

Laravel 4 和 AngularJS - 使用路由清理 URL

AngularJS + Laravel 5 身份验证

同时使用 Laravel 和 Angularjs 路由

AngularJS 和 Laravel - CORS