URL重写子虚拟目录

时间:2014-12-08 23:31:57

标签: iis url-rewriting

想象一下,我有这个网站:

http://localhost/site/admin

哪里"网站"是一个IIS虚拟目录和" admin"是" site"中的一个IIS虚拟目录。虚拟目录。两个"网站"和" admin"可以这么说是单独的网站,因为一个是主网站,另一个是管理门户网站。我遇到的问题是网址的管理门户网站部分。

假设我有一个index.php,它会显示要显示的页面名称,例如:

http://localhost/site/admin/index.php?p=cats

我使用URL重写来允许上面的URL写成:

http://localhost/site/admin/cats

我刚刚使用IIS规则向导来创建这种规则:

模式:^([^/]+)/?$
行动:index.php?p={R:1}

这很好用。

但是我现在正试图访问这样的网址:

http://localhost/site/admin/cats/123

这实际上是:

http://localhost/site/admin/index.php?p=cats&id=123

我试图使用这样的模式:

^([^/]+)/([0-9]+)/?$

似乎URL工作正常,但副作用是我的所有相对路径现在都不正确。我想要的是:

http://localhost/site/admin/pages/header.php

但它最终成为:

http://localhost/site/admin/cats/pages/header.php

我认为它正在发生,因为重写后的网址有#34;猫"在" admin"之后部分,但我无法弄清楚如何正常工作。

谢谢!

1 个答案:

答案 0 :(得分:0)

至少应该做的是确保不重写现有页面/内容(例如header.php)。此外,您应该URL编码从URL获得的部分。如果没有给它一个彻底的测试,这应该可行:

<rule name="Rewrite">
    <match url="^(([^/]+)/)+([\w]+)/?([0-9]+)?$"/>
        <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true"/>
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true"/>
        </conditions>
    <action type="Rewrite" url="index.php?p={UrlEncode:{R:3}}&id={UrlEncode:{R:4}}"/>
</rule>