如何使用 IIS URL 重写排除目录?

Posted

技术标签:

【中文标题】如何使用 IIS URL 重写排除目录?【英文标题】:How to exclude a directory with IIS URL rewriting? 【发布时间】:2014-01-09 14:51:49 【问题描述】:

我有一个 domain.com/index.php 和一个友好的 url 规则来重定向 domain.com/index.php?s=?要求。我使用带有 URL 重写插件的 IIS 网络服务器。

以上工作正常。但是对admin目录的请求有问题……

我也有 domain.com/admin/cloud/index.php,有时需要它来获取或发送数据(通过 Ajax)。当规则处于活动状态时,数据不可用,当我删除上述规则时,数据可用。

如何使用上述 url 规则并排除 domain.com/admin/.. 内(或发往)的所有其他请求?

这是我目前的规则集:

<rule name="RedirectUserFriendlyURL1" stopProcessing="true">
    <match url="^index\.php$" />
    <conditions>
        <add input="REQUEST_METHOD" pattern="^POST$" negate="true" />
        <add input="QUERY_STRING" pattern="^s=([^=&amp;]+)$" />
    </conditions>
    <action type="Redirect" url="C:1" appendQueryString="false" />
</rule>
<rule name="RewriteUserFriendlyURL1" 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="index.php?s=R:1" />
</rule>

我尝试了很多方法,包括路径信息...但没有成功。也许有人可以给个提示?

谢谢!

【问题讨论】:

您好,这里提供两条规则。哪个规则会弄乱 /admin/cloud/index.php 请求? 好问题。我不知道。似乎 IIS 或 URL 重写模块弄乱了请求。我现在已经拆分规则:1)检查它是否包含“云”和 2)检查它是否必须重写为 index.php(因此从友好 url 到内部 url)。如果检查有效,则第一个规则停止处理(在这种情况下,第二个规则不是必要的)......由于某种原因,第一个检查不是绕过问题的解决方案。 [..] [..] 只有第二条规则,友好的 url 有效,但管理部分无效。只有第一条规则管理部分正在工作,但不是友好的 url 部分。有时,它确实有效......但几分钟或几小时后,具有两个独立规则的解决方案不再有效。我不知道在哪里可以找到“真正的问题”。 【参考方案1】:

看看here,您可以添加此规则,以便当您不想处理的请求出现时,您可以忽略它并停止处理。

它应该放在最前面,这样这条规则在其他两条之前执行。

<rule name="block" stopProcessing="true">
    <match url="^admin/cloud/index.php$" />
    <action type="None" />
</rule>

【讨论】:

@Shahdat 这些规则在请求到达 ASP.NET 引擎之前应用,因此它应该可以工作。考虑发布一个问题并将链接放在这里,以便我查看。 @Tasos 我刚刚想通了。我不得不将操作类型更改为 CustomResponse

以上是关于如何使用 IIS URL 重写排除目录?的主要内容,如果未能解决你的问题,请参考以下文章

IIS URL将Http重写为Https,排除单个URL

thinkphp在iis下如何写规则url重写

IIS8如何安装和使用URL重写工具-URL Rewrite

IIS通过http方法重写排除规则

使用 IIS 7 重写模块重写 & 符号 URL

如何配置iis rewrite模块的url重写规则