Подтвердить что ты не робот

IIS 7 Rewrite rule throws HTTP Error 403.14 - Запрещено, если существует папка

У меня есть один веб-сайт, перенаправленный 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/contacto, cursos/masinformacion/10, cursos/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 пытается получить доступ к папке cursos перед запуском правил перезаписи

4b9b3361

Ответ 1

Проблема произошла из-за завершающего слэша. Вы можете исправить ее в два этапа:

1. Закрепите ваше регулярное выражение до ^cursos(\/?)$

2. Запустите это правило на первом месте:

<rule name="cursos redirect" stopProcessing="true">
  <match url="^cursos(\/?)$" />
  <action type="Rewrite" url="/index.php/{R:0}" appendQueryString="true" />
</rule>