利用URL重写实现参数目录化
参数目录化,就是将 类似 http://www.abc.com/store/store.aspx?id=1024 这样的网址,对外改为 http://www.abc.com/1024。
要实现这种功能,可以用以下三种方式(应该不仅限这三种吧!)
1、用微软的 Microsoft URL 重写模块 2.0,但只能给IIS7使用,IIS6不行。
64位:
http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=1b8c7bd8-8824-4408-b8fc-49dc7f951a00
32位:
http://www.microsoft.com/zh-cn/download/details.aspx?id=5747
2、isapi_rewrite
http://www.helicontech.com/download-isapi_rewrite3.htm
但完全版有日期限制,如果不想掏钱,有大牛破解了,可以用下面这个:
http://download.csdn.net/detail/keke0307/3867086
3、urlrewriter.net
这个有源代码,可以自己编译。
机缘巧合之下,我用了方法一 和 二。因为开发机器是WIN7,装了IIS7,所以用微软的重写模块;而服务器是WIN2003,就用了isapi_rewrite。
下面就这两种方法分别做一点心得介绍。
事实上,这两种方法大同小异,IIS基本上不用怎么配置,没有网上说的那么玄妙,又是勾选,又是映射,又是权限之类,关键在于要写对正则表达式。
1、微软的 Microsoft URL 重写模块 2.0
安装好之后,就可以改写网站下的web.config了。
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpRuntime/>
</system.web>
<system.webServer>
<rewrite>
<rules>
<!-- 实现http://localhost/1024 ==> http://localhost/store/store.aspx?id=1024 -->
<rule name="storecode">
<match url="^([1-9][0-9]*)/?$" ignoreCase="true"/>
<action type="Rewrite" url="/store/store.aspx?id={R:1}"/>
</rule>
<!-- 实现http://localhost/1024/p=1&c=1 ==> http://localhost/store/store.aspx?id=1024&p=1&c=1 -->
<rule name="storecode with param">
<match url="^([1-9][0-9]*)/([^/]+)/?$" ignoreCase="true"/>
<action type="Rewrite" url="/store/store.aspx?id={R:1}&{R:2}"/>
</rule>
<!-- 下面这些据说是从Discuz论坛里导出来的,肯定是正确的,供学习借鉴 -->
<!--
<rule name="已导入的规则 1">
<match url="^userinfo-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="userinfo.aspx?userid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 2">
<match url="^showforum-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="showforum.aspx?forumid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 3">
<match url="^showtopic-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="showtopic.aspx?topicid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 4">
<match url="^showforum-([0-9]+)-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="showforum.aspx?forumid={R:1}&page= {R:2}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 5">
<match url="^showtopic-([0-9]+)-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="showtopic.aspx?topicid={R:1}&page= {R:2}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 6">
<match url="^archiver/showforum-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="archiver/showforum.aspx?forumid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 7">
<match url="^archiver/showtopic-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="archiver/showtopic.aspx?topicid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 8">
<match url="^archiver/showtopic-([0-9]+)-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="archiver/showtopic.aspx?topicid={R:1} &page={R:2}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 9">
<match url="^archiver/showforum-([0-9]+)-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="archiver/showforum.aspx?forumid={R:1} &page={R:2}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 10">
<match url="^tools/rss-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="tools/rss.aspx?forumid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 11">
<match url="^tools/spacerss-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="tools/rss.aspx?uid={R:1}&type=space" appendQueryString="false" />
</rule>
<rule name="已导入的规则 12">
<match url="^tools/photorss-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="tools/rss.aspx?uid={R:1}&type=photo" appendQueryString="false" />
</rule>
<rule name="已导入的规则 13">
<match url="^space\/((\w|\s)+)((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="space/index.aspx?user={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 14">
<match url="^space\/((\w|\s|-)+)((\/?))?\?((.*)+)$" ignoreCase="false" />
<action type="Rewrite" url="space/index.aspx?user={R:1}&{R:5}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 15">
<match url="^showdebate-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="showdebate.aspx?topicid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 16">
<match url="^showbonus-([0-9]+)\.html$" ignoreCase="false" />
<action type="Rewrite" url="showbonus.aspx?topicid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 17">
<match url="^postgoods-(\d+)*.html$" ignoreCase="false" />
<action type="Rewrite" url="postgoods.aspx?categoryid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 18">
<match url="^showgoodslist-(\d+)(-(\d+))?.html$" ignoreCase="false" />
<action type="Rewrite" url="showgoodslist.aspx?categoryid={R:1} &page={R:3}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 19">
<match url="^showgoods-(\d+)*.html$" ignoreCase="false" />
<action type="Rewrite" url="showgoods.aspx?goodsid={R:1}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 20">
<match url="^install((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/install{R:1}" />
</rule>
<rule name="已导入的规则 21">
<match url="^upgrade((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/upgrade{R:1}" />
</rule>
<rule name="已导入的规则 22">
<match url="^aspx/([0-9]+)((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/aspx/{R:1}{R:2}" />
</rule>
<rule name="已导入的规则 23">
<match url="^archiver((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/archiver{R:1}" />
</rule>
<rule name="已导入的规则 24">
<match url="^space((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/space{R:1}" />
</rule>
<rule name="已导入的规则 25">
<match url="^doc((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/doc{R:1}" />
</rule>
<rule name="已导入的规则 26">
<match url="^(([\w|\-|_])+)((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/{R:1}/list.aspx" />
</rule>
<rule name="已导入的规则 27">
<match url="^(([\w|\-|_])+)((\/?))?\?(.)*$" ignoreCase="false" />
<action type="Rewrite" url="/{R:1}/list.aspx?{R:2}" appendQueryString="false" />
</rule>
<rule name="已导入的规则 28">
<match url="^(([\w|\-|_])+)/([0-9]+)((\/?))?$" ignoreCase="false" />
<action type="Rewrite" url="/{R:1}/{R:3}/list.aspx" />
</rule>
<rule name="已导入的规则 29">
<match url="^(([\w|\-|_])+)/([0-9]+)((\/?))?\?(.)*$" ignoreCase="false" />
<action type="Rewrite" url="/{R:1}/{R:3}/list.aspx?{R:4}" appendQueryString="false" />
</rule>
-->
</rules>
</rewrite>
</system.webServer>
</configuration>
关键是要
写对正则表达式
,否则系统会报无法找到资源的404错误。真他妈的。就不能报点别的错误?害得我在网上疯狂搜索,以为差了哪里没配置,还差点将IIS重装了。网上也不会告诉你这个答案,他们只是建议将文件是否存在的选项去掉,诸如此类。
HTTP 错误 404.0 - Not Found
您要找的资源已被删除、已更名或暂时不可用。
2、isapi_rewrite
安装之后,就可以直接使用了。打开IIS6,点击网站-属性,会看到:
点 EDIT,会在网站根目录下生成一个.htaccess文件。在里面编写我们的正则表达式:
# Helicon ISAPI_Rewrite configuration file
# Version 3.1.0.87 RewriteRule ^([1-9][0-9]*)/eurl\.axd/ /store/store.aspx\?id=$1 [NC]
RewriteRule ^([1-9][0-9]*)/([^/]*)?/? /store/store.aspx\?id=$1&$2 [NC]
其正则表达式的语法,似乎跟微软的URL重写模块没有多大区别,并且它还自带了一个正则表达式测试器,打开
.htaccess文件的时候,在编辑器菜单里可以看到,RegExp test:
但我发现有2点需要注意:
1、正则表达式里,不能出现问号(“\?”),否则一定匹配失败,但正则表达式绝对正确,放在其他正则表达式测试器里测试,也OK,但在这里就不行。不知道什么原因。翻遍互联网,有个兄弟说:
这是因为 url 里面 ? 后面的不被 apache 认为是 requested uri 的内容,所以你怎么写都无法取得。
建议你修改 url 格式:比如把 ? 去掉;或者改变获取方式:比如改成 RewriteRule /?(.*)$ /reg.php?id=$1&%
帖子:http://bbs.csdn.net/topics/300052355
但我这个是IIS耶!真搞不懂,不管了。所以我原本想将优化后的地址设为:http://www.abc.com/1024?p=1&c=1的,结果怎么试都不成功,最后只能放弃问号,改成:http://www.abc.com/1024/p=1&c=1
2、IIS6 + .net 4的情况下,IIS会自动在无后缀(什么叫无后缀?不懂)地址后加上 "/eurl.axd/guid号",刚好跟我机器一样。本来这个在ASP.NET处理过程中,会被自动去掉,但在这里,经过转向后,居然还保留了下来,我在测试过程中,在目标页面显示 Request.QueryString,居然可耻地显示出这种不速之客:
网上有文章介绍用修改注册表的方式来屏蔽
http://www.admin10000.com/document/1244.html
但我想着以后可能会采用MVC模式,所以只在写正则表达式时将这个因素考虑进去了:
RewriteRule ^([1-9][0-9]*)/eurl\.axd/ /store/store.aspx\?id=$1 [NC]
利用URL重写实现参数目录化的更多相关文章
- 利用URL重写实现Session跟踪
Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话.这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作 ...
- 利用URL重写隐藏复杂的URL
第一步:模拟映射页面 我们想在一个页面上点击guid.html链接,跳转到比较复杂URL的guid_{492f3e0b-848e-11da-9550-00e08161165f}.html页面.即定义一 ...
- .htaccess技巧: URL重写(Rewrite)与重定向
URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上.有关htacces ...
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect)
URL重定向是.htaccess的重头戏,它可以将长地址转为短地址.将动态地址转为静态地址.重定向丢失的页面.防止盗链.实现自动语言转换等.笔者觉得难点是在正则表达式的运用和理解上. 实现所有这些神奇 ...
- .htaccess技巧: URL重写(Rewrite)与重定向(Redirect) (转)
目录 Table of Contents 一.准备开始:mod_rewrite 二.利用.htaccess实现URL重写(rewrite)与URL重定向(redirect) 将.htm页面映射到.ph ...
- htaccess URL重写rewrite与重定向redirect(转)
1. 将 .htm 页面映射到 .php 1 Options +FollowSymlinks 2 RewriteEngine on 3 RewriteRule ^(.*)\.htm$ $1.php [ ...
- Ubuntu_16.04 配置 Apache Rwrite URL 重写
Ubuntu Apache配置Rwrite URL重写 0. apache目录
- DTcmsV4.0分析学习——(3)URL重写
3.URL重写 3.1 控制流程 通过IHttpModule控制所有页面请求,具体流程如下 (1)真实路径可正常访问 (2)前台页面通过URL重写映射aspx目录,后台页面通过URL重写映射admin ...
- vue-router 利用url传递参数
vue-router 利用url传递参数 :冒号的形式传递参数 在路由配置文件里以:冒号的形式传递参数,这就是对参数的绑定. 1. 在配置文件里以冒号的形式设置参数.我们在/src/router/i ...
随机推荐
- iOS 之 多线程一
iOS中实现多线程的技术方案 pthread 实现多线程操作 代码实现: void * run(void *param) { for (NSInteger i = 0; i < 1000; ...
- 定位 - CoreLocation - INTULocationManager
https://github.com/intuit/LocationManager #import "ViewController.h" #import "INTULoc ...
- 反射实体自动生成EasyUi DataGrid模板 第二版--附项目源码
之前写过一篇文章,地址 http://www.cnblogs.com/Bond/p/3469798.html 大概说了下怎么通过反射来自动生成对应EasyUi datagrid的模板,然后贴了很多 ...
- App小样在手机运行了一下
外包公司把App小样的安装包发过来了,我在安卓手机上试了一把,虽然还只有几个静态页面,但安装那一刻还是小激动了一把. 在某美术系MM的帮助下,我基本掌握了原型软件azure. 事实证明,很多东西都是逼 ...
- 如何监控 Tomcat?Zabbix 与 Cloud Insight 对比
JVM 监控工具有很多,像命令 jstat,jmap,jstack,jinfo 可以根据不同需求查看不同的系统信息,还有图像化界面 jconsole,都是很方便的工具.这些可以参考 JAVA自带监控工 ...
- Spring 配置方式
1.bean的配置方式:通过全类名(反射),通过工厂方法(静态工厂方法&实例工厂方法).FactoryBean. 2.静态工厂方法:直接调用某一个类的静态方法就可以返回bean的实例. cla ...
- Java final知识点
被final修饰的值,只可以被赋值一次. 被final修饰的类,其所有方法就变成了final方法,该类也不能被继承. 被final修饰的方法,不能在子类中重写. public static void ...
- 【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)
[题意] 给定一个含有n个数的序列a[1],a[2],a[3]--a[n], 程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k ...
- ASP.NET Web API 2 入门(一)
前言 HTTP 不是只是为了服务的 web 页.这也是建设公开服务和数据的 Api 的强大平台.HTTP 是简单的. 灵活的和无处不在.你能想到的几乎任何平台有 HTTP 库,因此,HTTP 服务可以 ...
- 灰度图像--图像增强 直方图均衡化(Histogram equalization)
灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...