现在的位置: 首页 > 综合 > 正文

Windows 下 Apache URL重写例子 解决静态资源后携带 ;jsessionid 信息而无法被Apache解析的问题

2014年09月06日 ⁄ 综合 ⁄ 共 1993字 ⁄ 字号 评论关闭

本文欢迎转载,以下为本人亲测,如有问题请留言,转载请注明:http://blog.csdn.net/wqmain/article/details/8942391

相信每个 Java 程序员都熟悉如下一种情形:访问一个需要登录的应用系统,当输入登录名和密码登录后,一般系统会保存相应的用户及权限信息到 session 中,同时会生成一个 session 的 唯一id值,称作:jsessionid ,它存放在的 浏览器的 cookie 中。当浏览器中选择禁用 cookie 后,需要通过 URL 重写来使动态资源部分携带这个jsessionid,否则用户的session信息会丢失,最终造成用户访问系统失败......

上面只是为了引入 jsessionid ,下面切入正题:假设用 Tomcat 作为你的应用服务器并且与Apache进行了整合(Apache 整合 Tomcat 配置见上篇博文,地址:http://blog.csdn.net/wqmain/article/details/8941759 ),Tomcat
下部署了A 系统。我们都知道,静态资源是一般交给Apache去处理的,那么你可能会遇到这种情况:当访问A系统时,很多图片和js、css文件有时无法找到,如下图所示:

查看Apache下的shsc-error_log.txt日志文件(在logs文件夹),可以看到“File does not exist:”的错误信息,如下图:

而实际上上面这个jquery-1.7.2.min.js是存在的,并且路径也正确,原因就是由于这个js文件的URL路径后面附加了 ;jsessionid=4C646819A6C4C65CD2952B12F7CBF8BB 这些信息才导致的Apache无法解析该文件,解决此类问题最简便的方法就是对Apache进行URL重写配置!

首先,用 UltraEdit 或 Notepad++ 打开 httpd.conf 文件,找到第118行的rewrite_module模块,去掉前面的#号,如下图所示:

然后在最下方的 VirtualHost 中加上启用URL重写及重写规则的代码,如下图所示:

RewriteRule即为URL重写规则,语法为正则表达式,$1 、$2、$3 分别代表第一、二、三个小括号中的内容;[ ]中的内容为URL重写规则的标志,具体标志见本文附录一。那么上面规则的意图已经很明显了,就是为了过滤掉URL中类似 ;jsessionid=4C646819A6C4C65CD2952B12F7CBF8BB 这样的字符串,当携带jsessionid的静态资源的URL交给Apache处理时,该URL中的jsessionid会被过滤掉后再去请求静态资源,这样就有效的避免了上述问题。

注:以下内容参考地址:http://slj.me/2009/04/apache-rewrite-regular/

附录一:Apache mod_rewrite规则重写的标志一览

1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联 如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量

抱歉!评论已关闭.