使用 angular.js 路由手动刷新时仍然出现“未找到”

Posted

技术标签:

【中文标题】使用 angular.js 路由手动刷新时仍然出现“未找到”【英文标题】:Still getting 'Not Found' when manually refreshing with angular.js route 【发布时间】:2013-12-07 08:17:35 【问题描述】:

阅读了大量关于 Angular.js 路由的文章和 *** 问题后,我在手动刷新时仍然收到“未找到”错误。

步骤:

    浏览到localhost --> 因为我的配置(如下),我被带到localhost/home。视图和一切都加载正常。 在浏览器中点击刷新 --> 浏览器显示此Not Found: the requested /home is not found on this server

这个问题大概最像Refreshing page gives "Page not found"

我的配置

// Routing configuration.
angular.module('myModule')
    .config(['$routeProvider', '$locationProvider', 
    function ($routeProvider, $locationProvider) 
        // Enable pushState in routes.
        $locationProvider.html5Mode(true);

        $routeProvider
            .when('/home', 
                templates: 
                    layout: '/views/home.html'
                ,
                title: 'Welcome!'

            )
            .when('/launchpad', 
                templates: 
                    layout: '/views/layouts/default.html',
                    content: '/views/partials/profile.html'
                ,
                title: "Launchpad"
            )
            .otherwise(
                redirectTo: '/home'
            );

    
]);

我做过的其他事情:

在我的index.html 中,我已经有<base href="/"> 升级到 Angular 1.2.1

这是我尝试过的 htaccess 规则。没有工作。

来自Refreshing page gives "Page not found"

<ifModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_URI !index
    RewriteCond %REQUEST_URI !.*\.(css|js|html|png) #Add extra extensions needed.
    RewriteRule (.*) index.html [L]
</ifModule>

来自http://ericduran.io/2013/05/31/angular-html5Mode-with-yeoman/

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^(.*)       /index.html/#!/$1 
</IfModule>

【问题讨论】:

您尝试过$locationProvider.html5Mode(true).hashPrefix('!');RewriteRule ^(.*)$ index\.html#!/$1 [L](点是保留字符,所以应该转义它)?你确定mod_rewrite 有效吗?很难判断错误在哪里,所以我会检查所有内容。 是的,我后来发现hashPrefix 是工作组合的一部分(见答案)。我相信mod_rewrite 正在工作,因为我能够从中获取日志输出:(使用块&lt;IfModule mod_rewrite&gt; RewriteEngine On RewriteLog MY_LOG_PATH RewriteLogLevel 3 &lt;/IfModule&gt;)。我尝试了 RewriteRule 和两个 RewriteCond(!-f!-d),但它对我不起作用。 嘿,你找到解决办法了吗??我可以在 hashbang 模式下刷新,但在 html5 模式下它仍然显示 Object not found 如果您有任何解决方案,请告诉我 【参考方案1】:

我无法发表评论,但除了使用HTML modebase href="/"sudo a2enmod rewrite,使用.htaccess 重写。从 Unispaw,我必须在 both 您网站的可用站点 /etc/apache2 apache.conf

AllowOverride All

【讨论】:

【参考方案2】:

对于仍然面临此错误的人,无论是否使用 SSL:

确保在 apacheconfig 中允许覆盖,例如

<Directory "/var/www/mysite/public_html">
    AllowOverride All
</Directory>

两个端口都使用 SSL

【讨论】:

【参考方案3】:

这个 .htaccess 设置对我很有效

<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_URI !^/$
    RewriteRule (.*) /#!/$1 [NE,L,R=301]
</IfModule>

【讨论】:

【参考方案4】:

我不知道这是否是最佳解决方案,但我确实找到了有效的设置组合:

包括hashPrefix('!')(见下文) 在我的 index.html 中未包含 &lt;base href="/"&gt; 根据this post,将FallbackResource /index.html 添加到我的服务器.conf 文件中的&lt;Directory PATH_TO_WWW_FILES&gt; 部分。设置后,本地的mod_rewrite 设置似乎并不重要。
// Routing configuration.
angular.module('myModule')
    .config(['$routeProvider', '$locationProvider', 
    function ($routeProvider, $locationProvider) 
        // Enable pushState in routes.
        $locationProvider.html5Mode(true).hashPrefix('!');

        $routeProvider
            .when('/home', 
                templates: 
                    layout: '/views/home.html'
                ,
                title: 'Welcome!'

            )
            .when('/launchpad', 
                templates: 
                    layout: '/views/layouts/default.html',
                    content: '/views/partials/profile.html'
                ,
                title: "Launchpad"
            )
            .otherwise(
                redirectTo: '/home'
            );

    
]);

【讨论】:

以上是关于使用 angular.js 路由手动刷新时仍然出现“未找到”的主要内容,如果未能解决你的问题,请参考以下文章

Angular:手动重定向到路由

即使我在 react/redux 中使用受保护的路由设置了身份验证,我仍然会被注销?当我刷新页面时

角4+:手动重定向路由

Angular D3js饼图在路由后消失

关于video标签,手动刷新后不能自动播放问题

Vue路由器,刷新显示空白页面