Angular 4 和 Laravel 5.4 的刷新路由问题

Posted

技术标签:

【中文标题】Angular 4 和 Laravel 5.4 的刷新路由问题【英文标题】:On-Refresh routing issue with Angular 4 and Laravel 5.4 【发布时间】:2018-07-26 00:55:42 【问题描述】:

我用 Angular 4 和 Laravel 5.4 创建了一个简单的应用程序来进行 CRUD 操作。

所以,基本上我有一个在 localhost:4200 上运行的 Angular 应用程序和在 localhost:8000 上运行的 Laravel 应用程序(仅用于 api)

现在我使用

将 angular 4 集成到 Laravel 中
 ng build

现在我的应用程序完全在 localhost:8000 Perfect 上运行!

现在是问题现场!

1 2 3

所以,如您所见,它采用角度路线,但当我刷新同一页面时,它正在寻找 laravel 路线。如何解决这个问题?

Laravel 路由仅用作 Angular 的 api 用于数据传输 json.

您的帮助将不胜感激!

【问题讨论】:

【参考方案1】:

好的,这已在 Angular 官方文档的 Deployment 部分中得到解决。问题是,Angular 应用程序是单页应用程序,这意味着它只有一个index.html 文件,而所有其他路由都由 Angular 浏览器客户端管理。 如果你从页面 A 到页面 B,你已经有一个 Angular 应用程序来处理重定向。但是,如果您刷新,浏览器将处理不包含您请求的页面的 API。

这意味着您需要配置您的服务器。如果您要实时部署,请使用此 .htaccess 配置,例如:

RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %DOCUMENT_ROOT%REQUEST_URI -f [OR]
RewriteCond %DOCUMENT_ROOT%REQUEST_URI -d
RewriteRule ^ - [L]
# If the requested resource doesn't exist, use index.html
RewriteRule ^ /index.html

它只会返回要呈现的 Angular 应用程序的 index.html 文件。否则配置你的 Laravel 路由来做同样的事情。

在这里了解更多关于这个问题的信息:Angular Deployment

【讨论】:

感谢您的回复。这是一个与 laravel 集成的 Angular 应用程序,它在 laravel 服务器中运行。 正如我所提到的,如果找不到路由,只需将您的路由配置为返回 Angular 应用程序的 index.html。这将解决问题。您不需要跟踪每个 Angular 路由,只要是404,那么它可能是一个Angular 路由,最好返回index.html 拥有一个 Anguar 404 页面可能也不错,只需使用 '**' 作为路由 所以我需要更改 laravel htaccess 吗? 我不是 Laravel 的专家,但如果你有一个 .htaccess 文件,那么只需复制粘贴我的答案中的豁免 - 应该可以完成这项工作【参考方案2】:

使用 Laravel 7 和 Angular 9。

这个答案没有使用RouterModule.forRoot(routes,useHash: true)

步骤:

1) 使用默认的<base href="/"> 构建您的应用程序。

2) 将所有文件从 dist/<project name> 复制到 Laravel 文件夹,public。

3) 从 Laravel 公用文件夹中,仅将 index.html 文件移动/剪切到 Laravel 资源/视图

4) 将index.html 重命名为index.blade.php

5) 在 Laravel 路由文件夹中,打开 web.php,删除并替换。

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

替换为:

Route::fallback(function () 
    return view('index');
);

这样所有找不到404错误的链接都会重定向到index.blade.php 就是这样!

Laravel public folder structure.

【讨论】:

或者如果你比较懒,把public/index.html移到resources/views/welcome.blade.php后,在web.php中添加:Route::fallback(function()return view ('欢迎'); );【参考方案3】:

对于 Angular 中的所有路由,您需要路由到 Laravel 中的索引操作。

试试:

foreach(['/', '/about', '/another_route'] as $route)
    Route::get($route,[
        'uses'=>'siteController@index',
        'as'=>'index'
     ]);

所有这些 URL 将被重定向到同一个入口点,由操作 siteController@index 呈现的视图(通常是主页),然后角度路由器将处理路由到正确的位置。

【讨论】:

感谢您的快速回复。你能告诉我索引函数里面应该是什么吗? 主页正在从角度路径加载。因此,如果我在注册页面(localhost:8000/register)并刷新,我应该得到相同的注册页面。不是主页。【参考方案4】:

所以,我终于解决了这个问题。感谢所有 cmets 并回复我的问题。 如果有人遇到同样的问题,请实施:

角度4中的hashlocationstrategy

我刚刚在 angular 的路由模块中添加了一个参数,效果很好。

RouterModule.forRoot(routes,useHash: true),

For more details, check here

【讨论】:

以上是关于Angular 4 和 Laravel 5.4 的刷新路由问题的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 和 WordPress 4.7 的辅助函数 __() 冲突

laravel 5.4 迁移问题

Laravel 5.4 “MethodNotAllowedHttpException”(基本任务列表)

laravel 5.4 中两种不同的身份验证模型

Laravel 5.4 事件广播不适用于 vuejs

无法将 Laravel 连接到 MailChimp(laravel 5.4)