使用angular.js路线手动刷新时仍然会“找不到”

时间:2013-11-22 12:35:27

标签: javascript .htaccess angularjs angular-routing

在Angular.js路线上阅读了大量的报告和stackoverflow问题之后,当我进行手动刷新时,我仍然收到“未找到”错误。

步骤:

  1. 浏览localhost - >因为我的配置(见下文),我被带到了localhost/home。观点和一切都很好。
  2. 在浏览器中点击刷新 - >浏览器显示此Not Found: the requested /home is not found on this server
  3. 这个问题可能与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="/">
    • 升级为角度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>
    

4 个答案:

答案 0 :(得分:8)

这个.htaccess设置对我来说效果很好

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

答案 1 :(得分:6)

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

  • 包括hashPrefix('!')(见下文)
  • 我的index.html
  • 中未包含<base href="/">
  • this post我的服务器FallbackResource /index.html文件中的<Directory PATH_TO_WWW_FILES>部分添加了.conf。设置完成后,本地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'
            });

    }
]);

答案 2 :(得分:1)

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

确保您在apacheconfig中使用Allowoverride,例如

<Directory "/var/www/mysite/public_html">
    AllowOverride All
</Directory>
两个端口的

是使用SSL

答案 3 :(得分:1)

除了使用HTML modebase href="/"sudo a2enmod rewrite,使用.htaccess重写之外,我无法发表评论。从Unispaw,我必须{strong} >您网站的可用网站 AllowOverride All