Reloading the page gives wrong GET request with AngularJS HTML5 mode

前端 未结 24 2769
慢半拍i
慢半拍i 2020-11-22 01:39

I want to enable HTML5 mode for my app. I have put the following code for the configuration, as shown here:

return app.config([\'$routeProvider\',\'$location         


        
相关标签:
24条回答
  • 2020-11-22 02:07

    I had a similar problem and I solved it by:

    • Using <base href="/index.html"> in the index page

    • Using a catch all route middleware in my node/Express server as follows (put it after the router):

    app.use(function(req, res) {
        res.sendfile(__dirname + '/Public/index.html');
    });
    

    I think that should get you up and running.

    If you use an apache server, you might want to mod_rewrite your links. It is not difficult to do. Just a few changes in the config files.

    All that is assuming you have html5mode enabled on angularjs. Now. note that in angular 1.2, declaring a base url is not recommended anymore actually.

    0 讨论(0)
  • 2020-11-22 02:10

    I wrote a simple connect middleware for simulating url-rewriting on grunt projects. https://gist.github.com/muratcorlu/5803655

    You can use like that:

    module.exports = function(grunt) {
      var urlRewrite = require('grunt-connect-rewrite');
    
      // Project configuration.
      grunt.initConfig({
        connect: {
          server: {
            options: {
              port: 9001,
              base: 'build',
              middleware: function(connect, options) {
                // Return array of whatever middlewares you want
                return [
                  // redirect all urls to index.html in build folder
                  urlRewrite('build', 'index.html'),
    
                  // Serve static files.
                  connect.static(options.base),
    
                  // Make empty directories browsable.
                  connect.directory(options.base)
                ];
              }
            }
          }
        }
      })
    };
    
    0 讨论(0)
  • 2020-11-22 02:10

    I had the same problem with java + angular app generated with JHipster. I solved it with Filter and list of all angular pages in properties:

    application.yml:

    angular-pages:
      - login
      - settings
    ...
    

    AngularPageReloadFilter.java

    public class AngularPageReloadFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.getRequestDispatcher("index.html").forward(request, response);
        }
    }
    

    WebConfigurer.java

    private void initAngularNonRootRedirectFilter(ServletContext servletContext,
                                                  EnumSet<DispatcherType> disps) {
        log.debug("Registering angular page reload Filter");
        FilterRegistration.Dynamic angularRedirectFilter =
                servletContext.addFilter("angularPageReloadFilter",
                        new AngularPageReloadFilter());
        int index = 0;
        while (env.getProperty("angular-pages[" + index + "]") != null) {
            angularRedirectFilter.addMappingForUrlPatterns(disps, true, "/" + env.getProperty("angular-pages[" + index + "]"));
            index++;
        }
        angularRedirectFilter.setAsyncSupported(true);
    }
    

    Hope, it will be helpful for somebody.

    0 讨论(0)
  • 2020-11-22 02:13

    There are few things to set up so your link in the browser will look like http://yourdomain.com/path and these are your angular config + server side

    1) AngularJS

    $routeProvider
      .when('/path', {
        templateUrl: 'path.html',
      });
    $locationProvider
      .html5Mode(true);
    

    2) server side, just put .htaccess inside your root folder and paste this

    RewriteEngine On 
    Options FollowSymLinks
    
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /#/$1 [L]
    

    More interesting stuff to read about html5 mode in angularjs and the configuration required per different environment https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#how-to-configure-your-server-to-work-with-html5mode Also this question might help you $location / switching between html5 and hashbang mode / link rewriting

    0 讨论(0)
  • 2020-11-22 02:13

    Solution for BrowserSync and Gulp.

    From https://github.com/BrowserSync/browser-sync/issues/204#issuecomment-102623643

    First install connect-history-api-fallback:

    npm --save-dev install connect-history-api-fallback
    

    Then add it to your gulpfile.js:

    var historyApiFallback = require('connect-history-api-fallback');
    
    gulp.task('serve', function() {
      browserSync.init({
        server: {
          baseDir: "app",
          middleware: [ historyApiFallback() ]
        }
      });
    });
    
    0 讨论(0)
  • 2020-11-22 02:13

    We had a server redirect in Express:

    app.get('*', function(req, res){
        res.render('index');
    });
    

    and we were still getting page-refresh issues, even after we added the <base href="/" />.

    Solution: make sure you're using real links in you page to navigate; don't type in the route in the URL or you'll get a page-refresh. (silly mistake, I know)

    :-P

    0 讨论(0)
提交回复
热议问题