1

我有以下已使用多年的 .haccess 规则,但是我需要将它们转换为在 web.config 文件中工作。

有人知道从哪里开始吗?

#Set the mapfiles for the category and product pages 
RewriteMap mapfile1 txt:maps/map_categories.txt 
RewriteMap mapfile2 txt:maps/map_products.txt 
RewriteMap lower int:tolower 

#FIX the trailing slash 
RewriteRule ^([^.?]+[^.?/])$ $1/ [R=301,L] 

#Define the rules for the CATEGORY pages 
RewriteCond %{URL} ^(?!/(cms|cms/.*)$)
RewriteCond %{URL} ^(?!/(vadmin|vadmin/.*)$)
RewriteCond %{URL} ^(?!/(bathroom-blog|bathroom-blog/.*)$) 
RewriteRule ^(?:[^/]+/)?([^/.]+)/?$ product_list.asp?catid=${mapfile1:${lower:$1}}&%{QUERY_STRING} [NC,L]

#Define the rules for the PRODUCT pages 
RewriteCond %{URL} ^(?!/(cms|cms/.*)$)
RewriteCond %{URL} ^(?!/(vadmin|vadmin/.*)$)
RewriteCond %{URL} ^(?!/(bathroom-blog|bathroom-blog/.*)$)  
#RewriteCond %{REQUEST_FILENAME}.asp -d 
#RewriteCond %{REQUEST_FILENAME}.asp -f
RewriteRule ^.+/.+/([^/.]+)/$ product_detail.asp?prodID=${mapfile2:${lower:$1}}&%{QUERY_STRING} [NC,L]

非常感谢任何帮助!

干杯,克里斯。

4

2 回答 2

2

我对 .NETweb.config文件了解不多。我最后一次使用它们是四年前。.htaccess因此,我首先逐步解释您的文件的作用。我关注的是做了什么而不是怎么做,也就是说,我不解释很多表达方式,比如^([^.?]+,看起来像在咒骂的漫画人物。

这是一个很长的答案,所以给自己喝杯咖啡。

让我们从前三行开始。

RewriteMap mapfile1 txt:maps/map_categories.txt 
RewriteMap mapfile2 txt:maps/map_products.txt 
RewriteMap lower int:tolower 

您的文件或主机配置中是否有RewriteEngine on某个位置?.htaccess

RewriteMap设置您可以在以下规则中使用的映射,如下所示${mapfile1:argument}:您应该有两个文件map_categories.txtmap_products.txt在您的maps子目录中。我可以想象您的应用程序会更新这些文本文件。第三个映射将大写字母转换为小写字母。



#FIX the trailing slash 
RewriteRule ^([^.?]+[^.?/])$ $1/ [R=301,L]

评论是真的。假设您有http://example.com/product,这将被重定向( HTTP 301 Moved Permanently) 到http://example.com/product/.



#Define the rules for the CATEGORY pages 
RewriteCond %{URL} ^(?!/(cms|cms/.*)$)
RewriteCond %{URL} ^(?!/(vadmin|vadmin/.*)$)
RewriteCond %{URL} ^(?!/(bathroom-blog|bathroom-blog/.*)$) 
RewriteRule ^(?:[^/]+/)?([^/.]+)/?$ product_list.asp?catid=${mapfile1:${lower:$1}}&%{QUERY_STRING} [NC,L]

如果您的 url 与这些完全一样:http://example.com/cms, http://example.com/cms/, http://example.com/cms/any_path, 以及 for vadminor bathroom-bloginstead of ,则使用相应的类别 IDcms调用。product_list.asp这些规则使用映射map_categories.txt将名称映射到 ID,并且还允许大小写混合,即使映射仅包含小写名称。

摘要:类别 id 的http://example.com/cms/some_category调用。product_list.aspsome_category



#Define the rules for the PRODUCT pages 
RewriteCond %{URL} ^(?!/(cms|cms/.*)$)
RewriteCond %{URL} ^(?!/(vadmin|vadmin/.*)$)
RewriteCond %{URL} ^(?!/(bathroom-blog|bathroom-blog/.*)$)  
#RewriteCond %{REQUEST_FILENAME}.asp -d 
#RewriteCond %{REQUEST_FILENAME}.asp -f
RewriteRule ^.+/.+/([^/.]+)/$ product_detail.asp?prodID=${mapfile2:${lower:$1}}&%{QUERY_STRING} [NC,L]

这真的很奇怪。这三个RewriteCond条件与上面的前三个完全相同。如果这确实有效,那么您的前任使用了一些 URL 重写黑魔法,例如通过在成功重写(没有重定向)后利用该规则,重新读取规则并再次将其应用于现在重写的 URL。要了解有关此的更多信息,我需要访问您的系统。

我已经知道我没有看到所有:RewriteEngine on以及映射文件。



URL 重写是众所周知的主题之一,如果不进行一些实验就很难做到这一点。难怪在 Stack Overflow 上很难立即获得工作帮助。问题是几乎总是需要访问所涉及的系统,因为如果不研究实时系统就不可能给出答案。

正如 Apache 本身所说:http ://shib.ametsoc.org/manual/misc/rewriteguide.html#page-header :

Apache 模块mod_rewrite是一个杀手级模块,即它是一个非常复杂的模块,它提供了一种强大的方式来进行 URL 操作。有了它,您几乎可以进行您梦寐以求的所有类型的 URL 操作。你必须付出的代价是接受复杂性,因为mod_rewrite它的主要缺点是初学者不容易理解和使用。甚至 Apache 专家有时也会发现mod_rewrite可以提供帮助的新方面。

换句话说:mod_rewrite你要么第一次射自己的脚,然后再也不使用它,要么因为它的力量而在你的余生中爱它。

重点是我的。

于 2012-10-26T09:18:25.600 回答
0

经过一个小时左右的谷歌搜索,我发现 IIS7 通过其 rewriteMaps 函数支持映射文件。以下两个网页为我提供了所需的解决方案,并且我创建了一个单独的“rewritemaps.config”文件来存储 ID-> URL 映射。

http://www.iis.net/learn/extensions/url-rewrite-module/using-rewrite-maps-in-url-rewrite-module

http://blogs.iis.net/ruslany/archive/2010/05/19/storing-url-rewrite-mappings-in-a-separate-file.aspx

任何希望将 .htaccess 地图文件配置转换为 web.config 的人,这两个页面都可以帮助您。

于 2012-10-31T11:09:17.777 回答