Jetty UrlRewrite 使用

本贴最后更新于 2719 天前,其中的信息可能已经东海扬尘

Jetty UrlRewrite 使用

Jetty 下载

Jetty 文档

UrlRewrite

  1. 更加简洁明快,例如 http://www.zhilehuo.com/video.jsp?id=1 的网址可以使用 rewrite 写成 http://www.zhilehuo.com/video/1.html
  1. 提高安全性,有效避免一些参数名,ID 等直接暴露在用户面前,同时不出 现 .jsp.aspx 等字眼,能够隐藏网站开发语言
  2. 有利于搜索引擎更好的抓取网站内容,搜索引擎更喜欢静态页面形式的网页,对静态页面的评分相对高于动态页面,使用 UrlRewrite 重写 URl 后更容易被搜索引擎收录

目录结构

Location Description
license-eplv10-aslv20.html Jetty 的许可文件
README.txt 有用的开始信息
VERSION.txt 版本信息
bin/ 存放在 Unix 系统下运行的 shell 脚本
demo-base/ 一个可运行包含示例 web 应用的 Jetty 服务器基目录
etc/ Jetty 的配置文件
lib/ Jetty 运行所必须的 jar 文件
logs/ 日志
modules/ 各个模块
notice.html 许可信息等
resources/ 包含新增到 classpath 配置文件夹,如 log4j.properties
start.ini 存放启动信息
start.jar 运行 Jetty 的 jar
webapps/ 一个用来存放运行在默认配置下的 Jetty Web 应用目录

OK,看完下载解压后的目录结构,进行 Rewrite 之前肯定先要跑一个项目看看效果。

运行 Jetty

执行以下代码,默认在 8080 端口开启服务

cd $JETTY_HOME
java -jar start.jar

执行成功会出现以下信息

2017-07-12 15:01:02.906:INFO::main: Logging initialized @417ms
2017-07-12 15:01:02.956:WARN:oejs.HomeBaseWarning:main: This instance of Jetty is not running from a separate {jetty.base} directory, this is not recommended.  See documentation at http://www.eclipse.org/jetty/documentation/current/startup.html
2017-07-12 15:01:03.126:INFO:oejs.Server:main: jetty-9.2.22.v20170606
2017-07-12 15:01:03.144:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/Users/user/Desktop/jetty/webapps/] at interval 1
2017-07-12 15:01:04.156:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@3c756e4d{/test,file:/Users/user/Desktop/jetty/webapps/test/,AVAILABLE}{/test}
2017-07-12 15:01:04.177:INFO:oejs.ServerConnector:main: Started ServerConnector@52a8ebc{HTTP/1.1}{0.0.0.0:8080}
2017-07-12 15:01:04.178:INFO:oejs.Server:main: Started @1689ms

这个时候可以通过浏览器访问 http://localhost:8080 但是这时候你会惊喜的发现你看到了一个伟大的 404 错误,为啥呢?因为你的 $JETTY_HOME/webapps 目录下没有部署任何 web 应用。但是刚刚目录结构有提到一个 demo-base 是一个包含示例 web 应用的服务器基目录,那么,我们运行这个 demo 看看:

cd $JETTY_HOME/demo-base/
java -jar $JETTY_HOME/start.jar

这次运行成功之后将会看到以下信息:

2017-07-12 15:11:40.083:INFO::main: Logging initialized @394ms
2017-07-12 15:11:40.346:WARN::main: demo test-realm is deployed. DO NOT USE IN PRODUCTION!
2017-07-12 15:11:40.352:INFO:oejs.Server:main: jetty-9.2.22.v20170606
2017-07-12 15:11:40.372:INFO:oejdp.ScanningAppProvider:main: Deployment monitor [file:/Users/user/Desktop/jetty/demo-base/webapps/] at interval 1
2017-07-12 15:11:40.612:WARN::main: test-jaas webapp is deployed. DO NOT USE IN PRODUCTION!
2017-07-12 15:11:41.039:INFO:oejsh.ContextHandler:main: Started o.e.j.w.WebAppContext@343f4d3d{/test-jaas,file:/private/var/folders/7j/v6j553qx4n9d21lzcjk3w_yw0000gp/T/jetty-0.0.0.0-8080-test-jaas.war-_test-jaas-any-6566505087846391340.dir/webapp/,AVAILABLE}{/test-jaas.war}
......
......
2017-07-12 15:11:42.152:INFO:oejs.Server:main: Started @2463ms

这次有点过分,输出好多,为了避免凑字数嫌疑,我加上了省略号
再次通过浏览器访问 http://localhost:8080 这个时候就可以看到 Jetty 的欢迎页

Jetty 欢迎页

好吧,用 jetty 开启一个服务,也看到了欢迎页了,到此结束,直接看配置 Rewrite 吧。

Rewrite 使用

  1. 首先直接在 Jetty 中的 webapps 中部署项目,在这里面就跟正常的使用 tomcat 发布 web 应用一样,使用 Intellij IDEA 的可以在 Project Structure > Artifacts 中添加一个 :war exploded 后,指定输出目录后,便可以得到一个直接部署的 war 包,放在 webapps 中就可以了。当然还有个粗鲁的方法就是直接找到你的项目位置,直接复制需要部署的目录文件夹,例如使用 Intellij IDEA,就是项目的 web 文件夹复制过去就行。

  2. 在 Jetty 的根目录中新建一个文件夹(test_etc)存放 Rewrite 的配置 xml 文件。

  3. 开始根据项目进行编写 Rewrite 配置(官网和 demo-base 中的 etc/demo-rewrite-rules.xml 均可以进行参考),后面我将会用实际代码举例。

  4. 将此 xml 命名为 rewrite.xml 放入刚刚新建的文件夹中。

  5. 为服务器添加重写模块

    cd $JETTY_HOME
    java -jar start.jar --add-to-start=rewrite
    

    然后你可以在 Jetty 根目录的 start.ini 中看到新增了一句 --module=rewrite ,然后在这句后面添上刚刚配置的 rewrite.xml 文件路径(此处例子全部是配置在 Jetty 的根目录的,可以直接写成 test_etc/rewrite.xml)

rewrite 的匹配规则 xml 文件示例:

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">

<Configure id="Server" class="org.eclipse.jetty.server.Server">
  <Ref refid="Rewrite">
      <!-- Add rule to protect against IE ssl bug -->
      <Call name="addRule">
        <Arg>
          <New class="org.eclipse.jetty.rewrite.handler.MsieSslRule"/>
        </Arg>
      </Call>

      <!-- redirect from the welcome page to a specific page -->
      <Call name="addRule">
        <Arg>
          <New class="org.eclipse.jetty.rewrite.handler.RewritePatternRule">
            <Set name="pattern">/test.html</Set>
            <Set name="replacement">/test/world.html</Set>
          </New>
        </Arg>
      </Call> 

      <!-- reverse the order of the path sections -->
      <Call name="addRule">
        <Arg>
          <New class="org.eclipse.jetty.rewrite.handler.RewriteRegexRule">
            <Set name="regex">^/world/(\d+).html$</Set>
            <Set name="replacement">/test/world.jsp?tid=$1</Set>
          </New>
        </Arg>
      </Call>
      
      </Ref>
</Configure>

xml 中 < set> 标签中配置有 pattern 为重写后的显示在地址栏的 URl,replacement 即为实际的地址
regex 便可以优雅的使用正则进行 URLRewrite。
本例子中展示了下这两种常用的重写方式,均可正常使用。

到此,便可以看到 URL 实现了重写,当然如果你链接跳转访问被重写的页面,你的 URL 也要写成重写后的样式,不然地址栏还是显示重写前的地址,当然你直接在地址栏输入重写后的地址也是可以访问的。

注意:匹配重写的 xml 文件在 start.ini 文件中路径一定要设置正确,不然会报错 not found

当然生产环境下,有可能并不会在 Jetty 根目录下的 webapps 中部署项目,这个时候就需要出现创建新的 Jetty 基目录。
创建 Jetty 基目录,此处官网有演示,这时进行 Rewrite 的话也就是在新建的基目录文件夹中增加 start.ini,并且也是必须在 start.ini 文件中添加 rewrite 模块以及配置重写规则 xml 文件的路径。

如下截图设置
1.png
2.png

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...