nginx rewrite 规则能玩吗→

.htaccess文件玩转Rewrite_PHP教程_编程技术
您的位置: &
& .htaccess文件玩转Rewrite
刚玩网页的时候,写的都是静态页 /about.htm 这样的结构。后来想换成 /about/但是又因为不熟悉rewrite,做了如下的调整,手动建立了一堆的文件夹:
这样的目录结构,维护起来相当麻烦。每次新加一个页面,都要开一个文件夹。其实采用左边那套结构部署上去,服务器稍做设置,就可以支持我们想要的URL效果。
如何玩 rewrite
首先看看自己的服务器是否支持 .htaccess如果支持这货,就不用每次写条规则就重启一次服务器了,便于测试。
redirect 301 /test.htm /
成功的话,当你访问 /test.htm 的时候,会自动跳到我的博客。不成功的话,需要开启一下 .htaccess :
打开 \conf\httpd.conf ,查找 #LoadModule rewrite_module,将#号去掉,加载该模块
打开 \conf\extra\httpd-vhosts.conf ,查找 AllowOverride None,将 None 变更为 All
环境准备完成后,还需要对&模式匹配&中特殊字符在rewrite的解读做一下了解:
* 代表前面0或更多个字符+ 代表前面1或更多个字符? 代表前面0或1个字符^ 代表字符串的开始位置^ 在方括号里代表&非&,例如[^/]代表非斜杠。$ 代表字符串结束的位置. 代表任何字符(也就是通配符)\ 取消后面字符的特殊意思,转为原义字符。&& 这部分的理解出自《SEO艺术》第六章末
开始干吧,打开.htaccess的rewriteRewriteEngine on
把 xxx.htm 文件 替换为 xxx/RewriteRule ^(.*)\/$ /$1.htm [L]
再给一个例子加深理解,这是将服务器上的 xxx.php 文件 替换成 xxx.htmlRewriteRule ^(.*)\.html$ /$1.php [L]
更多用法:
让所有访问 /xxx/ 的用户 跳转到 /xxx/RewriteCond %{HTTP_HOST} ^ [NC]RewriteRule ^(.*)$ /$1 [L,R=301]
对指定目录开启转向的代码:RewriteBase /top/
带搜索参数的转向:RewriteRule ^search/(.+)?$ /index.php?s=$1 [QSA,L]
目录末尾补斜线:RewriteRule ^(.+[^/])$ /$1/ [R]
?下一篇:已经没有了
( 02:12:00)
( 23:52:00)
相关排行总榜美桌网精选推荐高清,希望大家喜欢!
&&&&&&Apache Rewrite 开启和使用方法
Apache Rewrite 开启和使用方法
日 15:04:47 来源:
在Windows下,我们一般使用的是Administrator账号,所以启用这两项非常简单:
在[Apache安装目录]/conf/httpd.conf中找到
#LoadModule rewrite_module modules/mod_rewrite.so
,去掉前面的注释符号#。如果没有这行,请添加。并确认apache安装目录下的modules文件夹中是否有
mod_rewrite.so
这个文件。这样就启用了
Mod Rewrite
[Apache安装目录]/conf/httpd.conf
&&& Options FollowSymLinks&&& AllowOverride None&&& Order deny,allow&&& Deny from all
AllowOverride None
AllowOverride All
”,这样所有的文件夹都支持.htaccess了,或者针对指定的文件夹启用.htaccess,可以在
[Apache安装目录]/conf/httpd.conf
&&& Options Indexes FollowSymLinks&&& AllowOverride All&&& Order allow,deny&&& Allow from all这种做法一般是和虚拟主机配置在一起的,所以大多数会把上述配置代码写入
[Apache安装目录]/conf/extra/httpd-vhost.conf
中,这样比较清晰易于管理。
重启Apache后,就ok了。
完成上诉步骤后,在Wordpress的固定链接中使用除默认外的链接设置,Wordpress会直接在其安装目录中生成对应的.htaccess,这样就可以使用设置的链接形式了。
在Mac OS X中一般不使用
账号,而是通过
相关权限。
一般情况下,我们把网站文件放在个人目录下,比如
,这样就涉及到Mac OS的权限管理,相对于Windows来说复杂不少。
在终端运行sudo vi /etc/apache2/httpd.conf,找到
#LoadModule rewrite_module modules/mod_rewrite.so
,去掉前面的注释符号#。
sudo vi /etc/apache2/extra/httpd-vhost.conf
&&& Options Indexes FollowSymLinks MultiViews&&& AllowOverride All&&& Order allow,deny&&& Allow from all这样整个
都可以支持
&sudo vi /Private/etc/apache2/users/[用户名].conf
,把其中的
AllowOverride None
AllowOverride All
。需要注意的是,以前的Mac OS X版本,路径可能是
/private/etc/httpd/users/[用户名].conf
在需要的目录新建.htaccess,并修改其权限为777,此处依旧以使用Wordpress的固定链接为例。
cd ~/Sites/Wordpresstouch .htaccesschmod 777 .htaccess新建文件的权限默认是
ls -l .htaccess
就可以看到,此时程序无法自动写入.htaccess,这种情况比较安全,但是需要手动写入。
退出后重启Apache:
sudo apachectl restart
完成上述设置之后,就可以使用Wordpress的固定链接功能了。需要注意的是,如果.htaccess是从Windows下直接复制过来,日志中可能会出现
without matchingsection
的报错。简单的解决方案就是新建文件,重新复制粘贴。
美桌网提醒您
本站永久网址
如忘记美桌网您也可搜索美桌网进入本站。> 博客详情
最近老大给一个任务让了解nginx rewrite的写法,用正则解决 将所有的诸如
/yyzz/nn.html rewirete 为
/?domain=xx&page=yy&id=nn&size=zz
于是开始看nginx的rewrite各种规则开始写出如下代码
if ($host ~* http:\/\/(.*)\.aaa\.cn) { set $subName $1; rewrite ^/([a-zA-Z]{2}})([a-zA-Z]{2})\/([a-zA-Z]{2})\.html & &?domain=$subName&page=$1&id=$3&size=$2 } 但是无论怎么调试均不能正常rewrite,上网查资料也没发现有价值的东西,就在开始怀疑人生的 时候,想到可以使用如下代码替换,那么问题解决。
if ($host ~* ^(xx).) {
& & set $subName $1;
& & rewrite ^/([
a-zA-Z])\1([a-z
A-Z])\2/([a-z
A-Z])\3.html$ & /?domain=$subName&page=$1$1&id=$3$3&size=$2$2
最终还是没了解为何就不支持{}。是nginx版本问题? 换了其他人的机子上测试依然不行。郁闷闷闷闷。。。。
时隔两天,今天无意中发现nginx的rewrite为何不支持{} &,原来正则表达式需要加上"",
修改如下:
if ($host ~* ^(xx).) {& & & set $subName $1;& & & rewrite "^/([&a-zA-Z]{2})([a-zA-Z]{2})/([a-zA-Z]{2}).html$"& &/?domain=$subName&page=$1&id=$3&size=$2&
测试,成功。哈哈
人打赏支持
码字总数 23719
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥7763人阅读
j2ee相关(66)
URL Rewrite的概念 URL Rewrite即URL重写,就是把传入Web的请求重定向到其他URL的过程。URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如/news/index.asp?id=123 使用UrlRewrite转换后可以显示为。&URL Rewrite有什么用? 1,首先是满足观感的要求。对于追求完美主义的网站设计师,就算是网页的地址也希望看起来尽量简洁明快。形如/news/index.asp?id=123的网页地址,自然是毫无美感可言,而用UrlRewrite技术,你可以轻松把它显示为 /news/123.html。2,其次可以隐藏网站所用的编程语言,还可以提高网站的可移植性。 当网站每个页面都挂着鲜明的.asp/.aspx/.php这种开发语言的标记,别人一眼即可看出你的网站是用什么语言做的。而且在改变网站的语言的时候,你需要改动大量的链接。而且,当一个页面修改了扩展名,它的pagerank也会随之消失,从头开始。我们可以用UrlRewrite技术隐藏我们的实现细节,这样修改移植都很方便,而且完全不损失pagerank。提高安全性,可以有效的避免一些参数名、ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规则的话直接会返回个404或错误页面,这比直接返回500或一大堆服务器错误信息要好的多3,最后也是最重要的作用,是有利于搜索引擎更好地抓取你网站的内容。理论上,搜索引擎更喜欢静态页面形式的网页,搜索引擎对静态页面的评分一般要高于动态页面。所以,UrlRewrite可以让我们网站的网页更容易被搜索引擎所收录。&使用urlrewrite的步骤如下:首页,访问其官网:http://tuckey.org/urlrewrite/,我下载的是最新的目前还处于Beta版的urlrewritefilter-3.2.0,下载后将其中的urlrewrite-3.2.0.jar扔到需使用此功能项目的lib目录中去其次,在web.xml中加入如下配置:&filter&
&filter-name&UrlRewriteFilter&/filter-name&
&filter-class&org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&/filter-class&
&init-param& (这个可以不写,是配置UrlRewriter日志的配置,级别定成WARN)
&param-name&logLevel&/param-name&
&param-value&WARN&/param-value&
&/init-param&
&filter-mapping&
&filter-name&UrlRewriteFilter&/filter-name&
&url-pattern&/*&/url-pattern&
&!-- 下两项可以不写 --&
&dispatcher&REQUEST&/dispatcher&
&dispatcher&FORWARD&/dispatcher&
&/filter-mapping& 过滤器的参数1.&confReloadCheckInterval:&配置文件重加载间隔.&0表示随时加载,&-1表示不重加载,&默认-12.&confPath:&配置文件路径.&是相对context的路径,&默认/WEB-INF/urlrewrite.xml3.&logLevel:&设置日志级别,&可以是:&TRACE,&DEBUG,&INFO(默认),&WARN,&ERROR,&FATAL,&log4j,&commons,&slf4j,&sysout:{level}(比如&sysout:DEBUG),&如果你使用普通的日志级别有一定困难,&可以调为:&sysout:DEBUG(表明是使用控制台输出的调试级别)4.&statusPath:&设置改变状态路径,&不能和已经安装的应用冲突(注意,&默认是/rewrite-status),&注意,&必须以/开始5.&statusEnabled:&设置status是否开启,&期望得到的值是true,&false,&默认true6.&statusEnabledOnHosts:&设置允许status的主机,&*可以被用作通配符,&默认是”localhost,&local,&127.0.0.1”7.&modRewriteConf:&设置rewrite模式,&默认是false,&使用mod-rewrite(可以参照apache服务器的mod_rewrite相关资料)方式的配置文件,&如果设置为true并且confPath没有设置则配置文件路径将会被默认为/WEB-INF/.htaccess8.&modRewriteConfText:&从这些参数的值加从载mod_rewrite样式的配置,&设置这些参数则其他所有的参数都会被忽略.&比如:&init-param&&param-name&modRewriteConfText&/param-name&&param-value&RewriteRule&^/~([^/]+)/?(.*)&/u/$1/$2&[R]RewriteRule&^/([uge])/([^/]+)$&/$1/$2/&[R]&/param-value&&/init-param&9.&allowConfSwapViaHttp:&设置是否允许通过HTTP方式交互设置参数,&比如,&通过调用/rewrite-status/?conf=WEB-INF/urlrewrite2.xml其实,urlrewrite其实就是个过虑器,它将会过虑用户的所有请求,符合规则的便对其进行重定向,具体的配置参数的使用方法见官方文档:/svn/trunk/src/doc/manual/3.2/index.html配置好web.xml后将下载的urlrewritefilter-3.2.0中的urlrewrite.xml配置文件放在WEB-INF目录下,这样在使用urlrewritefilter时它便自动到该目录下读取相关的配置了,我配置了个简单的,代码如下:&rule&
&from&/zh_CN/NewsInfo/NEWS_([0-9]+)&/from&
&to&/zh_CN/NewsInfo/view.do?method=view&id=$1&/to&
&outbound-rule&
&from&/zh_CN/NewsInfo.do/?method=view&id=([0-9]+)$&/from&
&to&/zh_CN/NewsInfo/NEWS_$1&/to&
&/outbound-rule& rule结点中form的规则默认使用的是正则表达式来匹配的,当用户访问服务器时的URL会与该配置相比较,如果符合规则就会按照下面to结点中的配置对其进行跳转,其默认是forward跳转,具体配置可见官网文档。outbound-rule结点是服务器解析后的页面URL对外表现的形式,配置与上面的大体相同,如我一新闻链接代码在JSP中书写的形式如下:&c:url var=&news_url& value=&/zh_CN/Press/view.do?method=view&id=${cur.id}&msg=Press& /&
&li&· &a href=&${news_url}& mce_href=&${news_url}& target=&_blank& title=&${cur.titleSub}&&${cur.title}&/a&&/li& 经服务器解析后,最终显示在页面中的将变成:&li&· &a href=&/项目名/zh_CN/NewsInfo/NEWS_9999& mce_href=&项目名/zh_CN/NewsInfo/NEWS_9999& target=&_blank& title=&${cur.titleSub}&&新闻标题&/a&&/li& 当用户点击此链接后urlrewrite便用通过rule的配置重跳转到真正的访问地址,这样便很好的隐藏了真实地址这其中有点是需要注意的,引用官网中的一段话:Using the example above JSP's with the code&a href=&&%= response.encodeURL(&/world.jsp?country=usa&city=nyc&) %&&&nyc&/a&will output&a href=&/world/usa/nyc&&nyc&/a&Or JSTL&a href=&&c:url value=&/world.jsp?country=${country}&city=${city}& /&&&nyc&/a&will output&a href=&/world/usa/nyc&&nyc&/a&Note, If you are using JSTL (ie, &c:url) this will work also.意思就是说需要转化的链接不能直接写在a标签中,需要写在c:url或其他服务器需要解析的变量中,这样才能对其重新显示&&urlrewrite.xml的配置和使用DTD约束&!DOCTYPE&urlrewrite&&&&&&&&PUBLIC&&-//tuckey.org//DTD&UrlRewrite&3.0//EN&&&&&&&&&&http://tuckey.org/res/dtds/urlrewrite3.0.dtd&&2.&&urlrewrite&/&2.1.&default-match-type(可选):&2.1.1.&regex,&默认.&所有未指定match-type属性的rule都使用java正则表达式进行匹配2.1.2.&wildcard:&所有未指定match-type属性的rule都使用通配符匹配引擎匹配2.2.&decode-using(可选):2.2.1.&header,&utf8:&默认.&使用request.getCharacterEncoding()得到的编码对URL解码,&如果是空,&使用utf8.2.2.2.&null:&不进行解码.&设置为:&decode-using=”null”2.2.3.&header:&仅仅使用request.getCharacterEncoding()解码2.2.4.&[encoding]:&仅仅使用一个指定的字符编码比如ISO-8859-1.2.2.5.&header,&[encoding]:&对一个URL解码时使用request.getCharacterEncoding(),&如果得到的值为空,&则使用encoding指定的编码.2.3.&use-query-string(可选):2.3.1.&false:&默认.&在from进行匹配的时候,&查询字符串不会参加2.3.2.&true:&查询字符串参与from的匹配2.4.&use-context(可选):2.4.1.&false:&默认.&from元素匹配时,&application的contex路径将不会增加到url中2.4.2.&true:&application的contex路径参与from元素的匹配3.&&rule&/&:&0个或多个3.1.&enabled(可选):3.1.1.&true:&默认.允许这个规则3.1.2.&false:&废弃这个规则3.2.&match-type(可选):3.2.1.&regex:&默认.&使用java正则匹配3.2.2.&wildcard:&使用通配符表达式引擎4.&&outbound-ruld&/&:&0个或多个.&和普通的rule非常相似,&但是这里是在response.encodeURL()方法调用时进行重写的.4.1.&enabled(可选):4.1.1.&true:&默认.&允许规则4.1.2.&false:&废弃规则4.2.&encodefirst(可选):4.2.1.&fasle:&默认,&在运行了encodeURL()方法之后运用这个重写规则4.2.2.&true:&在encodeURL()之前运用这个重写规则5.&&name&/&:&一个用于记录规则名称的可选元素,&可以在&rule&/&和&outbound-rule&/&上使用6.&&note&/&:&用于记录规则描述的一个简单可选元素,&可以用在&rule&/&和&outbound-rule&/&上.7.&&condition&/&:&针对规则的选择条件.&注意,&在规则运用的时候必须满足所有的条件.7.1.&type(可选):&7.1.1.&header:&默认.&如果设置,&头名称必须通过&condition&/&的name属性指定7.1.2.&method:&请求方法.&GET,&POST,&HEAD等7.1.3.&port:&application运行的端口7.1.4.&time:&服务器当前时间(使用Unix时间戳),&这个通常被用于确保内容仅在设置的时间存活7.1.5.&year:&服务器的当前年7.1.6.&month:&服务器的当前月份7.1.7.&dayofmonth:&当天是一月的第几天,&每月第一天是17.1.8.&dayofweek:&当天是一周的第几天,&星期天是77.1.9.&ampm:&上午或下午7.1.10.&hourofday:&一天的第多少小时(24小时制)7.1.11.&minute:&当前服务器时间的分7.1.12.&second:&当前服务器时间的秒7.1.13.&millisecond:&当前服务器时间的毫秒7.1.14.&attribute:&检查request的属性(getAttribute)值,&要检查的属性名称通过&condition&/&的name指定7.1.15.&auth-type:&检查request属性的值.&&&request.getAuthType7.1.16.&character-encoding:&接收到请求的编码7.1.17.&content-length:&请求的长度(对于拒绝响应大请求很有用)7.1.18.&content-type:&请求类型7.1.19.&context-path:&请求的contex路径7.1.20.&cookie:&检查cookie值,&cookie的名称通过&condition&/&的name属性指定7.1.21.&parameter:&检查请求参数,&参数名称通过&condition&/&的name属性指定7.1.22.&path-info:&相当于request.getPathInfo()7.1.23.&path-translated:&相当于request.getTranslated()7.1.24.&protocol:&用于过滤协议7.1.25.&query-string:&得到url后面的参数字符串7.1.26.&remote-addr:&IP地址过滤7.1.27.&remote-host:&远程主机过滤(注意,&仅仅在应用服务器配置了查看(远程)主机名时才可用)7.1.28.&remote-user:&当前登录用户,&如果用户被授权可用7.1.29.&requested-session-id:&当前session的id7.1.30.&request-uri:&请求URL的从协议名到查询字符串部分7.1.31.&request-url:&重构后的URL,&返回的URL包含协议,&服务器名称,&端口,&路径,&但不包含查询字符串7.1.32.&session-attribute:&检查session中的属性(getAttribute),&属性名称通过&condition&/&的name属性设置.7.1.33.&session-isnew:&检查session是不是新的7.1.34.&server-name:&请求发送到的服务器的主机名(从host这个头中得到的不是机器名)7.1.35.&scheme:&请求的scheme7.1.36.&user-in-role:&注意,&这里的值不能是正则表达式7.2.&name:&配合一些特殊type使用的,&可以是任何值7.3.&next:&7.3.1.&and:&默认.&下一个和这一个条件都必须匹配7.3.2.&or:&下一个或这一个条件匹配7.4.&operator:&7.4.1.&equal:&默认.&指定正则和真实值匹配7.4.2.&notequal:&真实值和正则不匹配7.4.3.&greater:&大于,&仅用于数值7.4.4.&less:&小于7.4.5.&greaterorequal:&大于等于7.4.6.&lessorequal:&小于等于8.&&from&/&:&通常在&rule&/&和&outbound-rule&/&中都必须指定一个,&值可以是正则表达式(Perl5方式的正则),&注意:&from指定的url是和contex相关的8.1.&casesensitive:&8.1.1.&false:&默认.&大小写不敏感8.1.2.&true:&大小写敏感9.&&to&/&:&可以是一个perl5样式的正则替换表达式9.1.&type:9.1.1.&forward:&默认.&请求匹配这个&rule&/&的所有&condition&/&,&并且URL使用内部跳转到”to”指定的地址(注意,&这里forward到的URL必须和UrlRewriteFilter位于同一个容器中)9.1.2.&passthrough:&和forward相同9.1.3.&redirect:&请求匹配所有&condition&/&和这个&rule&/&的&from&/&,&通知客户端跳转到&to&/&指定地址9.1.4.&permanent-redirect:&相当于做了以下事情response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);response.setHeader(“Location”,&[&to&/&指定的值]);9.1.5.&temporary-redirect:&相当于做了以下事情response.setStatus(HttpServletResponse.&SC_MOVED_TEMPORARILY);response.setHeader(“Location”,&[&to&/&指定的值]);9.1.6.&pre-include9.1.7.&post-include9.1.8.&proxy:&请求URL将会以全路径被代理,&使用此特性需要引入commons-http和commons-codec包9.2.&last:&9.2.1.&false:&默认.&其余&rule&/&将会处理如果这个匹配9.2.2.&true:&如果匹配这个规则将不会处理9.3.&encode:9.3.1.&false:&&rule&/&下是默认值.&在rewrite之前,&用response.encodeURL([to的值])编码URL9.3.2.&true:&&outbound-rule&/&下默认值.&不会编码URL9.4.&context:&如果应用服务器配置了允许”穿透context”通信,&那么这个属性可以被用于forward(并且仅仅能用于forward)请求到另外一个serlvet&context…..也就是跨应用forward在Tomcat上,&server.xml或context.xml中配置crossContext=”true”,&例如:&允许两个应用”app”和”forum”之间通信,&那么可以如下配置:&Context&docBase=”app”&path=”/app”&reloadable=”true”&crossContext=”true”&/&&Context&docBase=”forum”&path=”/forum”&reloadable=”true”&crossContext=”true”&/&10.&&to&/&的其他方面10.1.&&to&/&可以是null,&意义为:&如果匹配请求不再继续,&相当于没有调用chain.doFilter10.2.&使用$N获取&from&/&中配置的子组,&N必须是1至10之间的数10.3.&任何&condition&/&中可以使用的type中的值都可以在&to&/&中使用,&比如&to&/%{parameter:page}&/to&10.4.&函数调用:&${函数名:&参数1:参数2}&&可以在&set&/&和&to&/&中使用nameexampleexample&returnsreplace${replace:my&cat&is&a&blue&cat:cat:dog}my&dog&is&a&blue&dogreplaceFirst${replace:my&cat&is&a&blue&cat:cat:dog}my&cat&is&a&blue&dogescape${escape:a&b&c}a+b+cunescape${unescape:a+b+c}a&b&clower${lower:Hello&World}hello&worldupper${upper:hello}HELLOtrim${trim:&abc&def&}abc&def11.&&set&/&:&在匹配规则的时候,&允许设置一些值.11.1.&type:11.1.1.&request:&默认.&类似于request.setAttribute11.1.2.&session:&session.setAttribute11.1.3.&response-header:&response.setHeader11.1.4.&cookie:&值以”[value][:domain[:lifetime[:path]]]”的格式设置.&&是指给客户端浏览器设置cookie,&cookie名称由&set&/&的name属性指定11.1.4.1.&value:&cookie的值11.1.4.2.&domain:&服务器11.1.4.3.&lifetime:&存货时间11.1.4.4.&path:&cookie的path11.1.5.&status:&response.setStatus11.1.6.&content-type:&response.setContentType11.1.7.&charset:&response.setCharacterEncoding11.1.8.&expires:&设置HTTP头中的过期时间,&设置的格式为{数值&类型},&比如:&“1&day&2&seconds”11.1.9.&locale:&response.setLocale11.1.10.&parameter:&允许将request.getParameter得到的某个参数的值在这里进行重新处理11.1.11.&method:&允许将request.getMethod()得到的值进行重新处理11.2.&name:&type是request,&session,&response-header,&cookie的时候,&必须设置name11.3.&举例:&rule&&condition&name=”user-agent”&Mozilla/3\.0&(&AvantGo&.*)&/condition&&from&.*&/from&&set&name=”client”&AvantGo&/set&&/rule&&rule&&condition&name=”user-agent”&UP\.Browser/3.*SC03&.*&/condition&&from&.*&/from&&set&name=”client”&Samsung&SCH-6100&/set&&/rule&12.&&run&/&:&允许在&rule&/&和&condition&/&都匹配的时候,&执行一个对象方法12.1.&class:&全限定名的类名,&期望调用方法的类名.12.2.&method(可选):&默认值为run.&&期望调用的方法名.&该方法必须有两个参数(HttpServletRequest&request,&HttpServletResponse&response).&&注意,&如果该对象有init(ServletConfig)或destroy()方法,&在创建和销毁对象的时候会自动调用,&ServletConfig中可以得到初始化参数,&参数通过&init-param&/&的方式传递:&run&class=”selfimpr.MyServlet”&method=”doGet”&&init-param&&param-name&id&/param-name&&param-value&1&/param-value&&/init-param&&/run&12.3.&neweachtime:&默认false.&表明是否每次请求都创建一个对象实例.13.&Tip13.1.&在配置中如果要使用”&”,&用&13.2.&简单起见,&给&from&/&的配置前面和后面分别加上^,&$,&这两个是正则表达式中的强制开始和结尾标志13.3.&如果使用&outbound-rule&要记得代码中的url都是编码过的13.4.&正则表达式非常复杂灵活,&请阅读java.util.regex.Pattern中的java正则介绍13.5.&如果觉得正则难以理解,&可以使用通配符方式13.6.&contex是非常重要的,&如果有一个应用的context是”/myapp”,&并且你的请求是”/myapp/somefolder/somepage.jsp”,&容器交给UrlRewriteFilter的url会是”/somefolder/somepage.jsp”,&这可能难以理解,&但是在你的&rule&和&condition&中不要包含context&path,&它是容器负责处理的.14.&通配符:&通配符匹配引擎可以替代正则表达式,&在&condition&和&rule&中设置match-type是wildcard用以开启支持通配符.(或者设置default-match-type)例如:/big/url/*匹配/big/url/abc.html但是不匹配/big/url/abc/dir/或/big/url/abc//big/url/**匹配/big/url/abc.html,&/big/url/abc/dir/和/big/url/abc/也可以和正则的替换一样,&每个*代表一个参数,&在&set&和&to&中用$N的方式使用&经验分享:在Java&web服务器内使用url&rewrite&每个网页或请求都是一个url地址,一般,这个地址可能是.do,.page,.action之类的并加上'?'号、'&'号查询串等构成的一个长长的的url。很urgly。&一般的url----------------------------------------------------------较好的url&http://www.xxx.net/user/profile.do?id=20001&&&====&&http://www.xxx.net/user/20001&http://www.xxx.net/forum/board.do?name=java&&&====&&http://www.xxx.net/forum/java&http://www.xxx.net/forum/thread.do?id=29923&&&====&&http://www.xxx.net/thread/29923&后者明显较为直观和漂亮。&使用url&rewrite可以很好的改善这个状况。网站url&rewrite应用是非常广泛的,良好的url设计给用户带来的非常好的体验,同时也能吸引搜索引擎的注意。&一种rewrite称为一个规则,上面的例子就是3个规则。rewrite技术可以在代理服务器实现,或者可以在tomcat之类的java&web服务器实现。&Apache&HTTP&Server&2.x&和&mod_proxy提供了不错的Rewrite处理方法。so如果使用apache,则直接在apache中配置Rewrite即可。但是对于没有使用代&理,或者不完全要在代理服务器配置Rewrite的web应用,通过第三方Jar包也是可以实现很perfect的rewrite技术的。这是本帖的着重&点。&这个第三方包的地址是:http://tuckey.org/urlrewrite/&(待会再去这个网站,现在先别去)&这个包使用正则表达式仿照了apache&rewrite的做法。而实现原理也是很明晰的:filter,forward,redirect机制组合:&在web.xml配置一个UrlRewriteFilter,拦截所有进来的请求,对服务要求的请求进行rewrite。比如,对&http://www.xxx.net/user/([0-9]+)请求,forward到/profile.do?id=$1。这就是一条规则。在这个&第三方包中的规则文件urlrewrite.xml中可以这样定义:Java代码&&rule&&&&&&&&&&from&^/user/([0-9]+)/?$&/from&&&&&&&&&&to&type=&forward&&/profile.do?id=$1&/to&&&&&/rule&&&&rule&&from&^/user/([0-9]+)/?$&/from&&to&type=&forward&&/profile.do?id=$1&/to&&/rule&对我来说,一般我会配置一个通用的rule,使所有没有包含&.&的url&forward到.do的action上来(本人使用strut做系统较多)&Java代码&&rule&&&&&&&&&&note&&&&&&&&&&&&&-&这是一个通用请求url&rewrite&&&&&&&&&&&&-&将请求forword&url加上“.do”的处理器上。&&&&&&&&&&&&-&例:&&&&&&&&&&&&-&&&&请求&http://{domain}/user/login&&&&&将被forward到&http://{domain}/user/login.do&&&&&&&&&&&&-&&&&请求&http://{domain}/user/login/&&&&将被forward到&http://{domain}/user/login.do&&&&&&&&&&&&-&&&&请求&http://{domain}/user/logout/&&&将被forward到&http://{domain}/user/logout.do&&&&&&&&&/note&&&&&&&&&&from&^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?$&/from&&&&&&&&&&to&type=&forward&&/$1.do&/to&&&&&/rule&&&&rule&&note&-&这是一个通用请求url&rewrite-&将请求forword&url加上“.do”的处理器上。-&例:-&请求&http://{domain}/user/login&将被forward到&http://{domain}/user/login.do-&请求&http://{domain}/user/login/&将被forward到&http://{domain}/user/login.do-&请求&http://{domain}/user/logout/&将被forward到&http://{domain}/user/logout.do&/note&&from&^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?$&/from&&to&type=&forward&&/$1.do&/to&&/rule&上面只是介绍个大概,并不是urlrewriter这个jar包的使用指南。如果你觉得这种rewrite做法不错的话,不如直接访问这个网站吧&[url]http://tuckey.org/urlrewrite/&[/url]&或者继续下面的getting&start&getting&start:&第一步:从http://tuckey.org/urlrewrite/&上下载urlrewrite-3.0.3.jar包,放到webapp&classpath下&第二步:在web.xml配置UrlRewriteFilter:&Java代码&&filter&&&&&&&&&&filter-name&UrlRewriteFilter&/filter-name&&&&&&&&&&filter-class&&&&&&&&&&&&&org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&&&&&&&&&/filter-class&&&&&&&&&&init-param&&&&&&&&&&&&&&param-name&logLevel&/param-name&&&&&&&&&&&&&&param-value&WARN&/param-value&&&&&&&&&&/init-param&&&&&/filter&&&&&filter-mapping&&&&&&&&&&filter-name&UrlRewriteFilter&/filter-name&&&&&&&&&&url-pattern&/*&/url-pattern&&&&&/filter-mapping&&&&filter&&filter-name&UrlRewriteFilter&/filter-name&&filter-class&org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&/filter-class&&init-param&&param-name&logLevel&/param-name&&param-value&WARN&/param-value&&/init-param&&/filter&&filter-mapping&&filter-name&UrlRewriteFilter&/filter-name&&url-pattern&/*&/url-pattern&&/filter-mapping&第三步:在web-inf下新建urlrewrite.xml文件,简单填入以下内容:&Java代码&&?xml&version=&1.0&&encoding=&utf-8&?&&&&&!DOCTYPE&urlrewrite&PUBLIC&&-//tuckey.org//DTD&UrlRewrite&3.0//EN&&&&&&&&&http://tuckey.org/res/dtds/urlrewrite3.0.dtd&&&&&&&&urlrewrite&&&&&&&&&&rule&&&&&&&&&&&&&&note&&&&&&&&&&&&&&&&&-&这是一个通用请求url&rewrite&&&&&&&&&&&&&&&&-&将请求forword&url加上“.do”的处理器上。&&&&&&&&&&&&&&&&-&例:&&&&&&&&&&&&&&&&-&&&&请求&http://{domain}/user/login&&&&&将被forward到&http://{domain}/user/login.do&&&&&&&&&&&&&&&&-&&&&请求&http://{domain}/user/login/&&&&将被forward到&http://{domain}/user/login.do&&&&&&&&&&&&&&&&-&&&&请求&http://{domain}/user/logout/&&&将被forward到&http://{domain}/user/logout.do&&&&&&&&&&&&&/note&&&&&&&&&&&&&&from&^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?$&/from&&&&&&&&&&&&&&to&type=&forward&&/$1.do&/to&&&&&&&&&&/rule&&&&&&&/urlrewrite&&&&?xml&version=&1.0&&encoding=&utf-8&?&&!DOCTYPE&urlrewrite&PUBLIC&&-//tuckey.org//DTD&UrlRewrite&3.0//EN&&http://tuckey.org/res/dtds/urlrewrite3.0.dtd&&&urlrewrite&&rule&&note&-&这是一个通用请求url&rewrite-&将请求forword&url加上“.do”的处理器上。-&例:-&请求&http://{domain}/user/login&将被forward到&http://{domain}/user/login.do-&请求&http://{domain}/user/login/&将被forward到&http://{domain}/user/login.do-&请求&http://{domain}/user/logout/&将被forward到&http://{domain}/user/logout.do&/note&&from&^/([_a-zA-Z]+[_0-9a-zA-Z-/]*[_0-9a-zA-Z]+)/?$&/from&&to&type=&forward&&/$1.do&/to&&/rule&&/urlrewrite&第四步:启动web应用,将原来需要.do的请求改为去掉.do后请求,看看结果。&第五步:更详细的规则定义,请看http://tuckey.org/urlrewrite/manual/3.0/&另外,tomcat自&5.0.15&后,提供了一个类似rewrite做法(for&simple&balance):&filter&+&自带或定制的rule规则实现&+&redirect重定向(没有forward,故url将被改为被重定向后的地址)。&在rewrite处理上,tomcat提供的功能是比较一般的,不及上面介绍的jar包。&但是tomcat的做法是根据具体的HttpServletRequest来做判断的,不仅仅是进来的请求的url,所以,各有千秋。&参考资料:&http://tomcat.apache.org/tomcat-5.5-doc/balancer-howto.html&http://src.opensolaris.org/source/xref/sfw/usr/src/cmd/tomcat/apache-tomcat-5.5.17-src/container/webapps/balancer/WEB-INF/classes/org/apache/webapp/balancer/Rule.java&&&&转载请标明出处
欢迎有识之士加入我们的技术交流群:
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2014062次
积分:18928
积分:18928
排名:第400名
原创:210篇
转载:28篇
译文:61篇
评论:1837条
文章:10篇
阅读:62816
文章:19篇
阅读:177888
文章:43篇
阅读:733180
(2)(1)(7)(4)(2)(2)(1)(8)(1)(2)(1)(1)(8)(2)(1)(1)(1)(3)(3)(2)(1)(3)(1)(1)(13)(3)(3)(5)(8)(2)(7)(5)(8)(3)(6)(3)(1)(4)(1)(5)(6)(4)(2)(2)(5)(2)(6)(12)(8)(1)(4)(2)(4)(1)(5)(3)(5)(2)(6)(1)(6)(9)(7)(16)(10)(4)(2)(3)(24)

我要回帖

更多关于 nginx rewrite 性能 的文章

 

随机推荐