我的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
的请求已正确重新路由到/
。
所以初步问题:这是预期/期望的行为吗?
主要问题:如果不是我期望/渴望的行为,我可以尝试哪些变通办法?
有人建议这不是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中有一个配置进程,用于通过使用通配符或正则表达式拦截路由?
这是该网站的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; }