我有一个网站,主页在index. cfm。页面内容是基于URL参数包含的,所以example.com/about(在web.config文件中被重写为index.cfm?p=about)将包含about. cfm。我想阻止人们直接访问about.cfm等文件,理想情况下将它们永久重定向到/about,但是我显然需要允许访问index.cfm,因为不将其从规则中排除会导致无限重定向。
我创建的规则(理论上也应该允许访问/ AJAX /目录中的文件)是:
<rule name="don't allow direct access to .cfm pages" stopProcessing="true">
<match url="^(.+[^\/ajax\/]\/)?([^\/]+[^index]).cfm$" />
<action type="Redirect" redirectType="Permanent" url="{R:1}/{R:2}" />
</rule>
According to the tester at regex101.com,这不应该选择下面列表中的1,2和4(根据需要),选择3(根据需要),但捕获整个index.cfm?p=contact in 5,我怀疑这是问题所在:
- http://example.com/contact
- http://example.com/index.cfm?p=contact
- http://example.com/contact.cfm
- http://example.com/ajax/contact-form.cfm
- http://example.com/index.cfm?p=contact.cfm
如果我访问example.com/contact.cfm,它会被重定向到https://example.com/index.cfm?p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=index&p=contact,即使它是文件中唯一的规则,但以下是美化URL的代码:
<rule name="Prettify URL" stopProcessing="true">
<match url="^(.+\/)?([^\/]+)$" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" negate="true" />
</conditions>
<action type="Rewrite" url="{R:1}index.cfm?p={R:2}" appendQueryString="false" />
</rule>
我错在哪里?谢谢!
1条答案
按热度按时间3z6pesqy1#
试试这样的方法:
此规则应将对任何
.cfm
页面(index.cfm
和ajax
文件夹中的页面除外)的请求重定向到所需的URL。这里使用了正则表达式
^(?!ajax)(?!index\.cfm)(.*?).cfm.*$
。它使用负lookaheads来防止匹配任何以ajax
或index.cfm
开头的内容。在regex101上演示。
我哪里做错了?
我不确定你的
web.config
的正确性,但是你的正则表达式是非常错误的。[^index]
意味着没有字母i
,n
,d
,e
,x
,例如。我建议阅读这篇answer来掌握一些正则表达式的理解。