关于URL重写:从数据库读伪地址,而不是web.config配置,大神进

时间:2020-12-07 08:50:55
自己参考某教程写了个URL重写模块,在BeginRequest事件中判断是否需要重写。若需要,就从数据库的sitemap表中检索请求的URL(数据字段为URL),如果存在,返回真正的URL地址(数据字段为RealURL)。程序工作正常,但有一点:

由于购买的空间可以放多个网站,为了便于管理,就为每个网站在根目录下建立了一个子文件夹(其实当前也就是存放了一个网站)。例如,当前网站的所有页面文件和配置文件全部存放于"abc"子文件夹中(程序文件位为abc/bin/中)。

页面的链接全部从数据库的URL字段读取,但最终形成的URL地址不是"http://www.ABC.com/Products/",而是"http://www.ABC.com/abc/Products/",比预期多了程序根目录的文件夹名称。。。

URL重写后生成的伪静态地址也是这样,浏览器地址栏中为"http://www.ABC.com/abc/Products/"。如果更改,能搞成"http://www.ABC.com/Products/" ?

谢谢!

P.S.:目前流行的URLRewirting.dll + web.config配置正则表达的方式好像可以,下载了源代码研究了一晚上,没瞅明白是怎么把程序目录的名称去掉的。。。主要是。。。不懂C#

13 个解决方案

#1


asp.net的话建议楼主用isapi rewrite啊

#2


to  楼主:

用重写及正则其实就是把http://www.ABC.com/abc/Products/这样的路径,替换成http://www.ABC.com/Products/这样的路径。

正则很简单。如果楼主其他都弄好了,要正则话,我可以给你写一个。

#3


soonfei:

其他的都弄好了,就是那个abc文件夹让人烦。如能提点,不胜感激!

另请教一个问题:

还写了一个名为SitemapHandler的HttpHandler处理程序,主要用于搜索引擎。计划是先将http://www.ABC.com/sitemap.xml提交给搜索引擎,在蜘蛛们造访时,调用处理程序,根据数据库内容生成sitemap.xml,而这个文件其实是不存在的。处理程序已在web.config注册过,在本地IIS上测试没问题。但上传到空间后发现处理程序不管用,该如何解决?

P.S.:空间是.net 4.0环境,安装IIS7.0,程序池是兼容(或说经典,即Classic),按理说应该没有问题。

#4



肯定能改
sql查找  匹配 替换 成你想要的格式
可以在数据库操作

#5


该回复于2012-07-04 09:35:45被版主删除

#6


begin:(http:\/\/www\.ABC\.com\/).+?(Products\/)
end:  $1$2

#7


引用 6 楼  的回复:
begin:(http:\/\/www\.ABC\.com\/).+?(Products\/)
end:  $1$2


放在哪一部分执行?

页面.aspx文件中放置了一个Literal控件. 程序中根据数据表内容生成Literal的Text值. 部分代码如下:

Dim modelList as New List (of SiteMap.Model)
modelList = BLL.SiteMap.GetAllItems


ltlMenu.Text= "<ul>"
For each myModel as SiteMap.Model In modelList
ltlMenu.Text +="<li><a title='" & mymodel.Title & "' href='" & ResolveUrl(myModel.URL) & "'>" & mymodel.Title & "</a>"

Next
ltlMenu.Text+="<ul>"
...

最终页面上形成的URL是 http://www.ABC.com/abc/Produts/Food/这种. 

与使用Literal服务器控件不关系吧?

#8


没人理了...

#9


我去。。还是VB的!~。。

#10


VB的咋了...

#11


asp.net4.0时代了啊,还要用第三方组件吗??
用自带的路由功能啦,动态编程做规则也很方便。
http://www.cnblogs.com/xray2005/archive/2011/07/03/2096938.html

#12


唉,我的问题仅仅是如何去掉程序文件夹的名称...怎么越来越复杂...

回到起点, 如果使用第三方URLRewriting组件(就是web.config是注册并添加正则表达的那个), 能否实现
Lookup: ~/abc/(正则不会写,意思就是abc开头的,不管后面是什么内容)
Sendto: XXX (仅去掉/abc,保留后面不变)

能否实现?谢谢!

#13


唉,最终还是自己搞定了...方法之简单, 无以言表. 换一个思路, 啥都解决了. 谢谢楼上各位

#1


asp.net的话建议楼主用isapi rewrite啊

#2


to  楼主:

用重写及正则其实就是把http://www.ABC.com/abc/Products/这样的路径,替换成http://www.ABC.com/Products/这样的路径。

正则很简单。如果楼主其他都弄好了,要正则话,我可以给你写一个。

#3


soonfei:

其他的都弄好了,就是那个abc文件夹让人烦。如能提点,不胜感激!

另请教一个问题:

还写了一个名为SitemapHandler的HttpHandler处理程序,主要用于搜索引擎。计划是先将http://www.ABC.com/sitemap.xml提交给搜索引擎,在蜘蛛们造访时,调用处理程序,根据数据库内容生成sitemap.xml,而这个文件其实是不存在的。处理程序已在web.config注册过,在本地IIS上测试没问题。但上传到空间后发现处理程序不管用,该如何解决?

P.S.:空间是.net 4.0环境,安装IIS7.0,程序池是兼容(或说经典,即Classic),按理说应该没有问题。

#4



肯定能改
sql查找  匹配 替换 成你想要的格式
可以在数据库操作

#5


该回复于2012-07-04 09:35:45被版主删除

#6


begin:(http:\/\/www\.ABC\.com\/).+?(Products\/)
end:  $1$2

#7


引用 6 楼  的回复:
begin:(http:\/\/www\.ABC\.com\/).+?(Products\/)
end:  $1$2


放在哪一部分执行?

页面.aspx文件中放置了一个Literal控件. 程序中根据数据表内容生成Literal的Text值. 部分代码如下:

Dim modelList as New List (of SiteMap.Model)
modelList = BLL.SiteMap.GetAllItems


ltlMenu.Text= "<ul>"
For each myModel as SiteMap.Model In modelList
ltlMenu.Text +="<li><a title='" & mymodel.Title & "' href='" & ResolveUrl(myModel.URL) & "'>" & mymodel.Title & "</a>"

Next
ltlMenu.Text+="<ul>"
...

最终页面上形成的URL是 http://www.ABC.com/abc/Produts/Food/这种. 

与使用Literal服务器控件不关系吧?

#8


没人理了...

#9


我去。。还是VB的!~。。

#10


VB的咋了...

#11


asp.net4.0时代了啊,还要用第三方组件吗??
用自带的路由功能啦,动态编程做规则也很方便。
http://www.cnblogs.com/xray2005/archive/2011/07/03/2096938.html

#12


唉,我的问题仅仅是如何去掉程序文件夹的名称...怎么越来越复杂...

回到起点, 如果使用第三方URLRewriting组件(就是web.config是注册并添加正则表达的那个), 能否实现
Lookup: ~/abc/(正则不会写,意思就是abc开头的,不管后面是什么内容)
Sendto: XXX (仅去掉/abc,保留后面不变)

能否实现?谢谢!

#13


唉,最终还是自己搞定了...方法之简单, 无以言表. 换一个思路, 啥都解决了. 谢谢楼上各位