【问题标题】:Laravel + AngularJS Nginx routingLaravel + AngularJS Nginx 路由
【发布时间】: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'。它应该放在您希望它执行的位置。

标签: php angularjs laravel nginx laravel-5.3


【解决方案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 的答案) - stackoverflow.com/questions/13297278/… P.S.有一个肮脏的解决方法 - 在不更改 nginx 的情况下删除 / 的 Laravel 路由并将您的视图放置到 resources/views/errors/404.blade.php。所以api 调用将转到api,任何其他请求将转到此视图。它只是给出 404 错误标头:)
猜你喜欢
  • 2013-05-10
  • 1970-01-01
  • 2016-11-15
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2015-04-23
  • 2015-10-08
相关资源
最近更新 更多