现在手头上的项目是一个单页面应用,所有的页面和路由逻辑都是写死在一个js文件里的,所以路过想实现一个特定url调到对应的渲染页面的话,需要用js实现一个路由,并且在nginx上实现路径跳转到对应的js。这里的js路由使用react的route实现的。
一 NGINX的配置
这里的 rewrite的配置和tryfiles的写法一样,你也可以用下面的配置实现
但是某个页面还是没有跳转成功。nginx的accsslog出现了如下的记录.很明显,第二个路径被nginx干掉了
10.207.87.51?23355?-?[20/Jun/2016:16:36:07?+0800]?"GET?http://xxx.com/specs/indicator/tab/atom"?200?998?"-"?"Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/48.0.2564.109?Safari/537.36"?"-"?"-"?"0acf573314664117679067908e"
? 10.207.87.51?1947?-?[20/Jun/2016:16:34:33?+0800]?"GET?http://xxx.com/help-doc/helpdoc/chanpin"?302?258?"-"?"Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.36?(KHTML,?like?Gecko)?Chrome/48.0.2564.109?Safari/537.36"?"-"?"-"?"0acf573314664116733311513e"
二 正常调用一个地址能够正确通过nginx路由到根目录的index页面
http://xxx.com/specs/indicator/tab/atom 它的reponse是index页面
三 访问新加的地址没有正确通过ngnix的路由,而是越过了ngnix直接打到了tomcat的对应地址
http://xxx.com/help-doc/helpdoc/chanpin 路径B 没有redirect到index页面.reopnse也是调进了tomcat的对应页面
四 随机访问一个不正确的地址,nginx可以正确路由到根目录的index文件
为了验证是不是NGINX的问题,这里再随机访问一个不存在的页面,通过nginxlocation的配置也应该返回index的内容。实际上正好返回的是nginx的内容
六 解决方案
为什么其他路径都是ok的,是不是nginx把helpdoc或者help-doc这样的字做了关键字?改造所有的前端路由及连接,将helpdoc都改成assist
我在indexvm页面增加一段脚本,如果url可以通过nginx写回到根目录,就会弹出一个提示框
重新加载之前404的页面,发现可以正确打出这个alert框,并且路径渲染成功
七 问题原因
为什么改一个路径就生效了?
第一段配置是什么?
请注意 .do 点在正则里是任意字符的意思,那我出错的地址是什么helpdoc啊。helpdoc里有什么,do吖。。。
所以原因就是helpdoc被.do 匹配了然后这没有走第二段的重定向,直接落到了tomcat下。
问题修复很简单,将第一段配置改成如下,注意反斜杠转义