我对 .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.txt
并map_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 vadmin
or bathroom-blog
instead of ,则使用相应的类别 IDcms
调用。product_list.asp
这些规则使用映射map_categories.txt
将名称映射到 ID,并且还允许大小写混合,即使映射仅包含小写名称。
摘要:类别 id 的http://example.com/cms/some_category
调用。product_list.asp
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]
这真的很奇怪。这三个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
你要么第一次射自己的脚,然后再也不使用它,要么因为它的力量而在你的余生中爱它。
重点是我的。