Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 删除URL中的#标记。但没有如预期的那样工作_Javascript_Angularjs - Fatal编程技术网

Javascript 删除URL中的#标记。但没有如预期的那样工作

Javascript 删除URL中的#标记。但没有如预期的那样工作,javascript,angularjs,Javascript,Angularjs,我刚刚从我的单页应用程序url中删除了#标记 我确实喜欢 $locationProvider.html5Mode(true); 而且效果很好 我的问题是,当我直接向浏览器输入任何url时,它会显示404错误。当我通过链接浏览整个应用程序时,它工作正常 Eg: www.example.com/search www.example.com/search_result www.example.com/project_detail?pid=19 所有这些url都工作正常。但是,当

我刚刚从我的单页应用程序url中删除了#标记

我确实喜欢

$locationProvider.html5Mode(true);
而且效果很好

我的问题是,当我直接向浏览器输入任何url时,它会显示404错误。当我通过链接浏览整个应用程序时,它工作正常

Eg: www.example.com/search  
    www.example.com/search_result
    www.example.com/project_detail?pid=19
所有这些url都工作正常。但是,当我直接在浏览器中输入上述任何url时,它会显示404错误

请考虑一下。
提前谢谢

我也有类似的问题。在我的案例中,服务器端实现包括Spring

客户端路由确保所有url更改都在客户端解决。但是,当您直接在浏览器中输入任何此类url时,浏览器实际上会转到服务器以检索与该url对应的网页。

现在在您的例子中,由于这些是虚拟URL,在客户端是有意义的,所以服务器抛出404

您可以在服务器端捕获页面未找到异常 并重定向到应用程序中的默认页面[路由]

在Spring中,我们确实有页面未找到异常的处理程序,所以我 我猜它们也可以用于您的服务器端实现


使用历史API时,您会说:

“这是一个新的URL。我刚才运行的另一个JavaScript已将该页面转换为您访问该URL所获得的页面。”

这要求您编写服务器端代码,为其他URL在该状态下构建页面。这不是一件小事,通常需要大量的工作

但是,作为交换,您可以获得健壮性性能。当访问其中一个URL时,它将:

  • 即使JS因任何原因(如断开的网络连接或不支持JS的客户端(如搜索引擎))失败,也可以正常工作
  • 加载速度比加载主页然后用JS转换要快

您需要使用重写规则。Angular是一个单页应用程序,因此您的所有请求都应该转到同一个文件(index.html)。您可以通过创建
.htaccess
来实现这一点

假设您的主页是index.html

类似于此(未经测试):

L标志表示如果规则匹配,则不执行下一个重写规则

QSA意味着URL查询参数也与重写的URL一起传递


有关htaccess的更多信息:

您需要配置服务器。请告诉我哪种配置。这是一个单页应用程序。谢谢。但在删除#标记之前,它是以另一种方式工作的。这使得使用HTML5模式毫无意义。你最终会得到一堆重复的内容(每个URL都是主页)。如果你打算这样做,那么你最好还是坚持使用hashbang(这很糟糕,但是(可以说)没有这个糟糕,而且工作量也少)。这不是真的。Angular router或UI router根据给定的URL初始化正确的页面。如果在页面上按F5,将加载正确的页面。我还建议使用“#”进行页面导航。就像我说的,Angular是一个单页应用程序。这就是我的观点。需要运行Angular JS才能加载页面。history API的要点是允许服务器端回退,这样您就不需要JS支持。没有javascript,您无法创建(交互式)Angle应用程序。如果您的一些用户没有启用javascript,那么开发javascript应用程序是没有意义的。您的解决方案仅适用于使用Angular在网站上显示简单内容而无需用户交互的情况。然后,就有可能从服务器上进行静态回退。没有JavaScript,你无法创建angular应用程序。你可以制作一个不依赖JavaScript的angular应用程序。看见JavaScript是一个提供响应性更强的页面和更好的UI的优秀工具。您可以在普通的HTML+服务器端的基础上构建它们,这样它就可以继续为每个人工作。你可能会觉得这不划算,但是在Hashbang上使用html5mode没有多大意义,因为html5mode可以提供Hashbang的好处,但是URL可以在没有JS的情况下工作。在删除#标记之前,它按照预期工作。我一直在构建一个单页应用程序。因此,在服务器中为这个特定问题配置是否可行。@Explore-X-在删除#之前,您正在加载主页,并依靠JS运行来转换它。这不是“配置”服务器的问题,您需要编写服务器端代码来完成与JS相同的工作。这是可能的。它是否可行取决于应用程序的具体情况(这将决定需要做多少工作)和您的资源(这将决定您能够做多少工作)。
RewriteRule ^(.)*$ / [L,QSA]