使用urlrewritefilter的一些疑问,请教大家

山哥 发布于 2012/03/15 09:28
阅读 1K+
收藏 1

最近在使用URLRewriteFilter,遇到一个不知道如何解决的问题:

配置一:

<rule>
   <from>^/headline$</from>
   <to>/HeadLine!list.action</to>
</rule>

上面的规则执行一切OK,http://127.0.0.1:8080/my/headline 转向的界面正常显示,包括css,图片等。

配置二:

<rule>
  <from>^/headline/([0-9]+)$</from>
  <to>/HeadLine!view.action?id=$1</to>
</rule>

上面的规则执行异常了,http://127.0.0.1:8080/my/headline/5601 转向到结果页面数据可以展示,但是css,图片全部失效,firebug发现:结果页面中的js,css,图片引用路径被自动加上了 /headline 前缀:原始:<img src="images/logo.png"/> --> 现在变成请求:/headline/images/logo.png 了,所以无法显示图片。

不解:from中的规则都是随便配置的,只要访问的URI满足from中的规则就转发to就行了,为什么页面的js,css,图片路径请求都变成了基于 /headline 下的呢? 该如何解决啊?

配置三:

想实现oschina的url重写功能,比如:

标准的:http://www.oschina.net/code/snippet_192190_9212
破坏的:http://www.oschina.net/code/snippet_192190_9212/abfdef
破坏的:http://www.oschina.net/code/snippet_192190_9212////2323

上面的3个url访问都可以访问到正确的内容:http://www.oschina.net/code/snippet_192190_9212,下面2个破坏的url后面的破坏部分好像都被丢弃了,但是我采用rule配置就怎么都实现不了:

<rule>
   <from>^/headline_([0-9]+)</from>
   <to>/HeadLine!view.action?id=$1</to>
</rule>

采用上面的配置,访问 http://127.0.0.1:8080/my/headline_2323 OK,但是破坏访问 http://127.0.0.1:8080/my/headline_2323/42323  http://127.0.0.1:8080/my/headline_2323/ 都不行,提示找不到地址,该如何配置啊?

 

加载中
0
山哥
山哥
希望大家帮忙看看,非常需要解决这些问题
0
Andre.Z
Andre.Z

“images/logo.png”是相对路径的,用"/images/logo.png"这种绝对的就是了。
另外测试的时候,自己改hosts加个域名,不要用这种ip形式的访问,而且你这种貌似还是一个默认host下面的虚拟目录,这种测试和时间发布的是有区别的吧,有可能你这样测试是好的,但是实际发布就出问题了。
hosts加入
www.a.com 127.0.0.1
web容器的配置加个host,指向你的项目目录。
直接访问 http://www.a.com/xxx.action之类的就好了。
初学的时候用过一会相对的路径,好多年没用过了,绝对路径没任何问题。

0
wartskcaj
wartskcaj

引用来自“Andre.Z”的答案

“images/logo.png”是相对路径的,用"/images/logo.png"这种绝对的就是了。
另外测试的时候,自己改hosts加个域名,不要用这种ip形式的访问,而且你这种貌似还是一个默认host下面的虚拟目录,这种测试和时间发布的是有区别的吧,有可能你这样测试是好的,但是实际发布就出问题了。
hosts加入
www.a.com 127.0.0.1
web容器的配置加个host,指向你的项目目录。
直接访问 http://www.a.com/xxx.action之类的就好了。
初学的时候用过一会相对的路径,好多年没用过了,绝对路径没任何问题。

+1
0
山哥
山哥

我们公司的项目都是运行在内网的,都是通过ip访问的,即使安装到客户那里也是内网ip访问,没有域名访问的。

“images/logo.png”是相对路径的,用"/images/logo.png"这种绝对的就是了。

项目所有页面中的css, js, 图片都是相对路径的,没有使用绝对路径,同时:如果改成<img src="/images/logo.png"/> 那这个图片加载也是错误的,它会请求 http://127.0.0.1:8080/images/logo.png 而不是 http://127.0.0.1:8080/my/images/logo.png

0
山哥
山哥
不解:from中的规则都是人为随便配置的,只要访问的URI满足from中的规则就转发to,为什么页面的js, css, 图片等相对路径请求都变成了基于 /headline 下的呢? 
Andre.Z
Andre.Z
虚拟目录之类的,烦死人了,从来不用。
Andre.Z
Andre.Z
说的是"/images/logo.png"之类的,没叫你直接弄去啊,你弄了个虚拟目录my,所以实际的应该是“/my/images/...”
0
Andre.Z
Andre.Z
你后面那个配置,会导致某些地址不转向,不转向的话,你用的又是相对路径,当然出问题。
0
山哥
山哥

项目的一些图片,css, js 等文件不都是放在项目的 WebRoot 下的吗? 然后页面中经常这样引入:

<img src="<%=request.getContextPath()%>/images/xxx.png"/> 
<script type="text/javascript" src="<%=request.getContextPath()%>/js/jquery.js"></script>

难道大家不是采用这种方式组织项目结构的啊?

Andre.Z
Andre.Z
@JSON : 你们的不需要那么做。你这个项目在用户那发布的时候,也是用虚拟目录的??那么,直接写死虚拟目录好了。如果不用虚拟目录的话,你自己本地测试为什么要用虚拟目录?你测试环境和用户那边都不一致,会多很多不必要的麻烦。如果你默认的host就指向你的项目,那么,就不会多一个啥my了。测试环境要完全模拟真实发布环境,这个完全是可以做到的。用相对路径+虚拟目录,出这种问题,正常的。
山哥
山哥
@Andre.Z : 你的意思是你的项目的css,js,图片等静态文件不放在项目的WebRoot下面,而是独立出来,独立引用吗? 能给个示例吗? 我们都是这么做的
Andre.Z
Andre.Z
从来不用,直接绝对路径。
0
山哥
山哥

该问题成功解决了,谢谢大家的帮助!

解决方法:

1. 在页面的head中增加 <base href="/contextPath/" />,来限定当前页面中相对路径访问都从 basepath 开始,而不是从当前 request forward的上下文路径下访问,这样就可以正确加载相对路径资源文件了,呵呵。

2. 如果你的项目直接抛到了端口访问下(即:http://127.0.0.1:8080访问),没有自己的上下文 ContextPath 的话,那页面中的css,js,img等相对路径前面增加 / 即可( href="css/main.css" --> href="/css/main.css" , 增加了 / 就变成绝对路径了)。

补充下:我上面提到的相对路径前面会自动加上 urlrewrite的from前缀,不是 urlrewritefilter的问题,而是 request forward 自身的机制:forward页面中的所有相对路径url访问都是基于当前页面的上下文路径访问的,所以通过 request.getRequestURI() 就会发现,请求的路径中多了当前页面所在的上下文路径。


返回顶部
顶部