У меня есть 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
Оказывается причина для всех папок с 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 г..
<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>
Вы можете попробовать следующие шаги:
изменить настройки в Виртуальные приложения и каталоги раздел назад к отображению /
в 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> </ конфигурации>