$ urlRouterProvider.otherwise('/')在路径以'。'开头时不起作用。

时间:2017-04-12 01:31:10

标签: angularjs nginx gulp angular-ui-router browser-sync

我的Angular应用程序中有以下内容(v1.5.3,ui-router v0.3.2):

  

/app/router.js

function router ($locationProvider, $urlRouterProvider) {
  $locationProvider.html5Mode(true);
  $urlRouterProvider.otherwise('/');
}

angular
  .module('analytics')
  .config(router);

通常这可以按预期工作。我没有/nonsense的路由,因此/nonsense的请求被路由到/。但是,如果我尝试导航到/.nonsense,我会得到40x响应(在Chrome中为404,使用curl;在Firefox和Safari中为403;未对IE或Edge进行测试。

/#/.nonsense的请求已正确重新路由到/

所以初步问题:这是预期/期望的行为吗?

主要问题:如果不是我期望/渴望的行为,我可以尝试哪些变通办法?

更新#1

有人建议这不是Angular问题,而是服务器配置问题。

我使用gulp(v4.0.0)+ browser-sync(v2.12.5)在本地运行应用程序。在prod中,我们正在使用nginx。这个问题在两种环境中都是一致的。

浏览器同步配置代码为:

  

/gulp-config/serve.js

const browserSyncInit = (baseDir, routes) => {
  sync.init({
    startPath: '/',
    server: {
      baseDir: baseDir,
      routes: routes
    },
    browser: 'default',
    notify: false,
    // The variable C is a config object defined elsewhere 
    host: C.siteConfig.webHost,
    port: C.siteConfig.webPort,
    https: C.siteConfig.webProtocol === 'https',
    open: 'external'
  });
}
...
browserSyncInit(
  [C.tmp(), C.app()],
  {'/bower_components': 'bower_components'}
);

因此,如果确实是服务器配置问题,我可能会修改传入的路由对象,即:

routes['/**/.*'] = '' 更新#2:这实际上无效:(

但是我不确定如何在nginx中完成这类事情,因为我没有参与项目的部署,也从未使用过nginx。

我假设nginx中有一个配置进程,用于通过使用通配符或正则表达式拦截路由?

更新#3

这是该网站的Angular应用程序部分的nginx配置。

  

/etc/nginx/slave/sites-available/example-dev_proxy.conf

upstream example-dev {
  zone upstream_dynamic 128k;
  server example-dev.service.internal.consul:31238 resolve;
}

server {
  listen 443 ssl;
  server_name *.dev.example.com;
  server_tokens off;
  add_header X-Frame-Options SAMEORIGIN;
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
  ssl_dhparam /etc/nginx/slave/ssl/dhparam.pem;

  location / {   
    proxy_pass https://example-dev;
    proxy_redirect off;
    proxy_set_header Host ;
    proxy_set_header X-Forwarded-For ;
    proxy_set_header X-Real-IP ;
    proxy_set_header X-Forwarded-Proto ;
  }

  ssl_certificate /etc/nginx/slave/ssl/example_dev_proxy.crt;
  ssl_certificate_key /etc/nginx/slave/ssl/example_dev_proxy.key;
  ssl_verify_client off;
  ssl_session_timeout 5m;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS;
  ssl_prefer_server_ciphers on;
}

1 个答案:

答案 0 :(得分:0)

所以看起来这是一个nginx问题,而不是Angular问题。默认行为是为以点开头的任何路径返回403。但据我了解,这是一种覆盖默认行为以返回404的方法:

location ~ /\. { deny all }

有关此here的更多信息。对于像我这样的nginx n00bs,我发现this有助于理解上述行。