Ошибка разрешения при использовании правил перезаписи в веб-приложении Azure

У меня есть PHP-приложение на основе Laravel 4, которое я успешно начал работать в веб-приложении Azure, единственная проблема, с которой я сталкиваюсь — это попытка получить доступ к файлам из example.azurewebsites.net/js/vendor/jquery.slicknav.min.js Я получаю сообщение «У вас нет разрешения на просмотр этого каталога или страницы». Отклик.

Папка site/wwwroot Здесь я размещаю все файлы приложений Laravel, для тех, кто не знаком с Laravel, он содержит четыре папки: app, Bootstrap, public и vendor.

Я установил Виртуальные приложения и каталоги настройка на портале Azure для сопоставления / в site\wwwroot\public и поместил в публичный каталог файл web.config со следующим содержимым:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
<staticContent>
<remove fileExtension=".svg" />
<mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
<mimeMap fileExtension=".woff" mimeType="application/font-woff" />
<clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" cacheControlMode="UseExpires" />
</staticContent>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type" />
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,DELETE,PUT,PATCH" />
</customHeaders>
</httpProtocol>
<rewrite>
<rules>
<rule name="Laravel4" stopProcessing="true">
<match url="^" ignoreCase="false" />
<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" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>

С этой настройкой перезапись работает, как и ожидалось, за исключением случаев, когда имя папки включает в себя приложение, Bootstrap, public или vendor, как это происходит с example.azurewebsites.net/js/vendor/jquery.slicknav.min.js,

Мой вопрос: как мне изменить правила переписывания, чтобы исправить эту проблему? Если я переименую папку site\wwwroot\public\js\vendor\ добавив дефис в конец, он будет работать. Я также перезагрузил контейнер несколько раз.

редактировать Для большей ясности это моя структура каталогов:

├─ wwwroot
│  └─ app
│  └─ bootstrap
│  ├─ public
│  │  └─ css
│  │  └─ files
│  │  └─ fonts
│  │  └─ imgs
│  │  ├─ js
│  │  │  └─ admin
│  │  │  ├─ app
│  │  │  │  └─ link-check.js
│  │  │  └─ old
│  │  │  ├─ vendor
│  │  │  │  └─ sortable.min.js
│  │  └─ less
│  │  └─ packages
│  │  └─ tmp
│  │  └─ uploads
│  └─ vendor
└─ ...

Со мной web.config конфигурация link-check.js доступен через example.azurewebsites.net/js/app/link-check.js в то время как sortable.min.js есть не доступны через example.azurewebsites.net/js/vendor/sortable.min.js (и ничего другого в пути / js / vendor не доступно).

Примечание: если я переименую wwwroot\public\js\vendor в wwwroot\public\js\vendor- Я могу просматривать sortable.min.js от example.azurewebsites.net/js/vendor-/sortable.min.js

3

Решение

Оказывается причина для всех папок с vendor на пути возврата 403 запрещено было то, что я имел Установлено расширение веб-приложения Azure Composer. В пределах applicationHost.xdt файл для этого расширения устанавливает следующее переписывание:

<rewrite xdt:Transform="InsertIfMissing">
<rules xdt:Transform="InsertIfMissing">
<rule name="RequestBlockingRule1" xdt:Locator="Match(name)" xdt:Transform="InsertIfMissing" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{URL}" pattern="vendor/(.*)$" />
</conditions>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="You do not have permission to     view this directory or page using the credentials that you supplied." />
</rule>
</rules>
</rewrite>

Для меня удаление расширения, очевидно, решило проблему, однако у меня есть ощущение, что добавление <clear/> чтобы мой раздел правил перезаписи очистил бы правила, установленные расширением, и решил проблему.

Для дальнейшего использования этот вопрос был поднят против 7 ноября 2015 и на 23 июля 2015 г..

Ниже показан мой исправленный файл web.config, который использует <clear/> решить проблему

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/>
<staticContent>
<remove fileExtension=".svg" />
<mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
<mimeMap fileExtension=".woff" mimeType="application/font-woff" />
<clientCache httpExpires="Sun, 29 Mar 2020 00:00:00 GMT" cacheControlMode="UseExpires" />
</staticContent>
<httpProtocol>
<customHeaders>
<add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type" />
<add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS,DELETE,PUT,PATCH" />
</customHeaders>
</httpProtocol>
<rewrite>
<rules>
<clear/>
<rule name="Laravel4" stopProcessing="true">
<match url="^" ignoreCase="false" />
<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" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
6

Другие решения

Вы можете попробовать следующие шаги:

  • изменить настройки в Виртуальные приложения и каталоги раздел назад к отображению / в site\wwwroot\

  • переместить web.config в public папку в корневой каталог, который может быть site\wwwroot на вашем сервере.

  • изменить web.config содержание следующего содержания:

<? xml version = "1.0" encoding = "UTF-8"?>
<конфигурация>
<system.webServer>
<перезапись>
<правила>
<rule name = "Переписать перенаправленный доступ к ресурсам (img, css, files, js, favicon)" stopProcessing = "true">
<match url = "^ (img | css | files | js | favicon.ico) (. *) $" />
</ правила>
<rule name = "Импортированное правило 1">
<match url = "^ (. *) $" ignoreCase = "false" />
<action type = "Rewrite" url = "/ public / {R: 1}" />
</ правила>
<rule name = "Импортированное правило 2" stopProcessing = "true">
<match url = "^ (. *) $" />
<условия logicGrouping = "MatchAll">
<add input = "{REQUEST_FILENAME}" matchType = "IsFile" ignoreCase = "false" negate = "true" />
<add input = "{REQUEST_FILENAME}" matchType = "IsDirectory" ignoreCase = "false" negate = "true" />
</ условия>
<action type = "Rewrite" url = "public / index.php / {R: 1}" />
</ правила>
</ правила>
</ переписывание>
</system.webServer>
</ конфигурации>
2