复杂的.hatccess规则转换为web.config

时间:2012-10-25 12:48:55

标签: .htaccess iis-7

我有以下。我已经使用多年的访问规则,但我需要将它们转换为在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]

非常感谢任何帮助!

干杯,克里斯。

2 个答案:

答案 0 :(得分:2)

我对.NET web.config文件了解不多。我最后一次使用它们是四年前的事。因此,我首先逐步解释您的.htaccess文件的作用。我专注于做什么而不是如何,i。例如,我不会解释像^([^.?]+这样的许多表达方式,这些表达方式看起来像是在咒骂的漫画人物。

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

让我们从前三行开始。

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.txt子目录中应该有两个文件map_products.txtmaps。我可以想象你的应用程序更新这些文本文件。第三个映射将大写字母转换为小写字母。



#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]

如果您的网址与以下网址完全相同:http://example.com/cmshttp://example.com/cms/http://example.com/cms/any_path以及vadminbathroom-blog而不是cms ,然后使用相应的类别ID调用product_list.asp。这些规则使用映射map_categories.txt将名称映射到ID,并且还允许混合大小写,即使映射仅包含小写名称。

摘要http://example.com/cms/some_category调用类别ID为product_list.asp的{​​{1}}。



some_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] 条件与上面的前三个条件完全相同。如果这确实有效,那么你的前任已经使用了一些URL重写黑魔术,例如通过在成功重写(没有重定向)之后利用它,重新读取规则并再次应用于现在重写的URL。要了解更多相关信息,我需要访问您的系统。

我已经知道我没有看到所有内容RewriteCond,以及映射文件。



URL重写是一个很难在没有实验的情况下很难做到的主题之一。难怪在Stack Overflow上开箱即可获得工作帮助很难。问题是几乎总是需要访问所涉及的系统,因为没有一些研究实时系统就无法给出答案。

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

  

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

     

换句话说:对于mod_rewrite,你要么第一次在脚下射击,再也不要再使用它了,或因为它的力量而终生爱它。 / p>

重点是我的。

答案 1 :(得分:0)

经过一个小时左右的谷歌搜索后,我发现IIS7通过其rewriteMaps函数支持mapfiles。以下两个网页为我提供了我需要的解决方案,并且我创建了一个单独的“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 mapfile配置转换为web.config的人都可以使用这两个页面。