如果文件夹存在,IIS 7重写规则会出现HTTP错误403.14 - 禁止访问。

9

我可以帮助您翻译这段内容,它涉及到IT技术。

我有一个使用php路由的网站。

我在web.config文件中进行了如下配置:

<rewrite>
  <rules>

    <!-- Quitar los slash '/' del final de la ruta -->
    <rule name="RewriteRequestsToPublic">
      <match url="^(.*)$" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      </conditions>
      <action type="Rewrite" url="/{R:0}" />
    </rule>

    <!-- la ruta /cursos/ directamente la redirigimos para que no dé error 403.14 al intentar 'explorar' el directorio -->
    <rule name="cursos redirect" stopProcessing="true">
      <match url="^cursos$" />
      <action type="Rewrite" url="/index.php/{R:1}" appendQueryString="true" />
    </rule>

    <!-- Si el archivo o carpeta solicitado no existe, se realiza la petición a través de index.php -->
    <rule name="Imported Rule 1" stopProcessing="true">
      <match url="^(.*)$" ignoreCase="true" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      </conditions>
      <action type="Rewrite" url="/index.php/{R:1}" appendQueryString="true" />
    </rule>
  </rules>
</rewrite>

除非路由匹配一个现有目录,否则它对我所有的站点路由都可以正常工作。

我有以下文件夹结构:

index.php
cursos/img
assets/img

我的网站可以轻松管理像这样的路由:/paginas/paginas/contactocursos/masinformacion/10cursos/img/banner.jpg等等...

但是如果我尝试访问/cursos,我会得到:HTTP错误403.14-禁止访问

我已经在web.config文件中添加了以下代码:

<!-- la ruta /cursos/ directamente la redirigimos para que no dé error 403.14 al intentar 'explorar' el directorio -->
<rule name="cursos redirect" stopProcessing="true">
  <match url="^cursos$" />
  <action type="Rewrite" url="/index.php/{R:1}" appendQueryString="true" />
</rule>

现在是这样的:

<rewrite>
  <rules>

    <!-- Quitar los slash '/' del final de la ruta -->
    <rule name="RewriteRequestsToPublic">
      <match url="^(.*)$" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      </conditions>
      <action type="Rewrite" url="/{R:0}" />
    </rule>

    <!-- la ruta /cursos/ directamente la redirigimos para que no dé error 403.14 al intentar 'explorar' el directorio -->
    <rule name="cursos redirect" stopProcessing="true">
      <match url="^cursos$" />
      <action type="Rewrite" url="/index.php/{R:1}" appendQueryString="true" />
    </rule>

    <!-- Si el archivo o carpeta solicitado no existe, se realiza la petición a través de index.php -->
    <rule name="Imported Rule 1" stopProcessing="true">
      <match url="^(.*)$" ignoreCase="true" />
      <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
      </conditions>
      <action type="Rewrite" url="/index.php/{R:1}" appendQueryString="true" />
    </rule>
  </rules>
</rewrite>

但是仍然无法工作。看起来IIS在运行重写规则之前尝试访问文件夹。

1个回答

3
问题发生是因为斜杠后面有多余字符。您可以采取以下两个步骤来解决问题:
1.将您的正则表达式修正为^cursos(\/?)$ 2.将此规则移到第一位:
<rule name="cursos redirect" stopProcessing="true">
  <match url="^cursos(\/?)$" />
  <action type="Rewrite" url="/index.php/{R:0}" appendQueryString="true" />
</rule>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接