IIS重写问题 - 捕获所有.php文件

时间:2015-06-11 11:12:53

标签: iis url-rewriting web-config rewrite

在一个文件夹中,我有几个.php文件(超过10个)

aaa.php
bbb.php
ccc.php
ddd.php
index.php

我想要实现的是正确地重写它们以便拥有友好的URL。重写是:

www.domain.com/data -> www.domain.com/data/index.php
www.domain.com/data/ -> www.domain.com/data/index.php
www.domain.com/data/aaa -> www.domain.com/data/aaa.php
www.domain.com/data/aaa/ -> www.domain.com/data/aaa.php
www.domain.com/data/aaa/chapter1 -> www.domain.com/data/aaa.php?c=chapter1

www.domain.com/data/bbb -> www.domain.com/data/bbb.php
www.domain.com/data/bbb/ -> www.domain.com/data/bbb.php
www.domain.com/data/bbb/chapter1 -> www.domain.com/data/bbb.php?c=chapter1

...

通过使用以下规则,我实现了我想要的单个php文件

<rule name="Friendly1" stopProcessing="true">
    <match url="^aaa$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="aaa.php" appendQueryString="false" />
</rule>
<rule name="Friendly2" stopProcessing="true">
    <match url="^aaa/$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="aaa.php" appendQueryString="false" />
</rule>
<rule name="Friendly3" stopProcessing="true">
    <match url="^aaa/(.+)\.(.+)$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.{R:2}" appendQueryString="false" />
</rule>
<rule name="Friendly4" stopProcessing="true">
    <match url="^aaa/(.+)$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="aaa.php?c={R:1}" appendQueryString="false" />
</rule>

有效。但是它效率不高,而且容易出错,为文件夹中的每个php文件复制这些规则。

所以,我想在规则中用(。+)交换 aaa ,但在某些情况下它不起作用。

<rule name="Friendly1" stopProcessing="true">
    <match url="^(.+)$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.php" appendQueryString="false" />
</rule>
<rule name="Friendly2" stopProcessing="true">
    <match url="^(.+)/$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.php" appendQueryString="false" />
</rule>
<rule name="Friendly3" stopProcessing="true">
    <match url="^(.+)/(.+)\.(.+)$" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.php/{R:2}.{R:3}" appendQueryString="false" />
</rule>
<rule name="Friendly4" stopProcessing="true">
    <match url="^(.+)/(.+)$" ignoreCase="true"/>
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="{R:1}.php?c={R:2}" appendQueryString="false" />
</rule>

适用于以下情况:

www.domain.com/data -> www.domain.com/data/index.php
www.domain.com/data/ -> www.domain.com/data/index.php
www.domain.com/data/aaa -> www.domain.com/data/aaa.php

它不适用于以下情况:

www.domain.com/data/aaa/ -> www.domain.com/data/aaa.php
www.domain.com/data/aaa/chapter1 -> www.domain.com/data/aaa.php?c=chapter1

在哪些情况下,我得到“未找到”。 难道我做错了什么?我该如何解决这个问题?

IIS = 7.5 +

提前谢谢。

1 个答案:

答案 0 :(得分:1)

这个怎么样......

<rewrite>
   <rules>
       <rule name="Friendly1" stopProcessing="true">
           <match url="^data/([-a-zA-Z0-9]*)/[-a-zA-Z0-9]*)$" ignoreCase="true" />
           <action type="Rewrite" url="data/{R:1}.php?c={R:2}" />
        </rule>
       <rule name="Friendly2" stopProcessing="true">
           <match url="^data/([-a-zA-Z0-9][-a-zA-Z0-9]*)$" ignoreCase="true" />
           <action type="Rewrite" url="data/{R:1}.php" />
        </rule>
        <rule name="Friendly3" stopProcessing="true">
           <match url="^data(/.*)$" ignoreCase="true" />
           <action type="Rewrite" url="data/index.php" />
        </rule>
    </rules>
</rewrite>