Какая настройка web.config позволит обслуживать apple-app-site-association?
Я добавил apple-app-site-association
файл в корень сайта, но IIS не доставляет файл.
Каков наилучший способ заставить сервер обслуживать этот конкретный файл без расширения файла? Есть ли способ в файле web.config явно сказать "обслужить этот файл"?
7 ответов
У меня была такая же проблема, и я нашел этот удивительный пост:
Обслуживание apple-app-site-association из IIS IIS обслуживает только файлы известных типов, определенных их расширением. Поскольку apple-app-site-association не включает расширение файла, IIS выдает ошибку 404, когда я пытаюсь открыть его с помощью браузера. Я исправил это, добавив mimeMap в файл web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<staticContent>
<!-- required for apple-app-site-association: -->
<mimeMap fileExtension="." mimeType="application/json" />
</staticContent>
</system.webServer>
</configuration>
Как объясняется в , по соображениям безопасности IIS обслуживает только известные типы файлов и использует расширение файла для определения типа файла. Вы можете объявить тип файла для файлов без расширений, позволяя их обслуживать.
Но это заставляет сервер обслуживать любой файл без расширений, что может привести к тому, что неожиданные файлы будут доставлены кому-либо, включая роботов, ищущих конфиденциальные файлы, неправильно защищенные.
Решение, объясненное ранее связанным этом ответеответом, может быть ограничено только этим файлом яблока. Лучше ограничить это. Использовать
location
узел для этого.
Кстати, подумайте о корректировке политики кеширования для этого файла, если ваша политика по умолчанию не подходит, особенно если ваш сервер находится за CDN.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
...
<location path="apple-app-site-association">
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="application/json" />
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="08:00:00" cacheControlCustom="public" />
</staticContent>
</system.webServer>
</location>
...
</configuration>
Не мое предпочтительное решение, но согласно комментарию DeyaEldeen, способ, которым я удовлетворил многие из наших потребностей, состоял в том, чтобы вместо этого использовать подход мета-тега (в пределах <head>
тег страницы):
<meta name="apple-itunes-app" content="app-id=5555555555">
Это делается для того, чтобы каждый раз, когда пользователи iOS обращались к сайту, им показывали всплывающее окно "Просмотр в магазине приложений" в верхней части страницы. Как только они нажимают на всплывающее окно, они направляются в магазин приложений.
См . Документы Apple для смарт-баннеров приложений.
Надеюсь, это поможет некоторым людям с похожими потребностями.
Чтобы добавить к решениям, предоставляемым решением mogile_oli и решением Frédéric , требуется немного дополнительная настройка при использовании IIS, настроенного для сайта Net.Core.
TLDR: Удалить
aspNetCore
обработчик в
.well-known/web.config
и примените существующее решение mogile_oli или Фредерика
Одним из решений является размещение папки .well-known в папке wwwroot, как предложено здесь . Однако это означает либо включение части вашего проекта .Net Core, либо добавление ее вручную после любого обновления публикации. Затем вы вносите изменения MIME, упомянутые mogile_oli или Фредериком.
Другое решение — настроить статические файлы в классе запуска приложения .Net Core, тогда папка/файлы смогут находиться за пределами проекта .Net Core. Обратной стороной этого подхода является то, что если вы захотите внести какие-либо изменения в каталог, потребуется пересборка приложения.
Решение, которое мы выбрали, не требует, чтобы приложение .Net Core знало о папке .well-known.
- Если у вас его еще нет, создайте
.well-known
папка в корне папки сайта IIS. - Добавьте свой
apple-app-site-association
(и если вы делаете то же самое для Android, вашassetlinks.json
файл тоже). - Добавьте файл web.config в папку .well-known со следующим:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="application/json" />
<!-- Only required for assetlinks.json if your IIS version doesn't already have .json defined -->
<!-- <mimeMap fileExtension=".json" mimeType="application/json" /> -->
</staticContent>
<handlers>
<!-- Assumes that you have the handler in your root web.config called aspNetCore. Change to match your configuration -->
<remove name="aspNetCore" />
</handlers>
</system.webServer>
</configuration>
Этот фрагмент кода останавливает работу приложения .Net Core с папкой .well-known, после чего мы можем настроить ее в соответствии с предыдущим решением mogile_oli. (В качестве дополнительного бонуса, если вы добавляете файл assetslinks.json и используете более старую версию IIS, вам также необходимо добавить mimeMap для файлов .json).
(Необязательно) Приведенный выше фрагмент кода применен ко всей папке .well-known, и, как упомянул Фредерик, это может представлять угрозу безопасности (особенно если у нас есть другие файлы в папке .well-known). Мы можем преобразовать приведенное выше, чтобы использовать рекомендации Фредерика по местоположению:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
<location path="apple-app-site-association">
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="application/json" />
</staticContent>
<handlers>
<remove name="aspNetCore" />
</handlers>
</system.webServer>
</location>
<!-- Only required for assetlinks.json -->
<location path="assetlinks.json">
<system.webServer>
<!-- Only required if your IIS version doesn't already have .json defined -->
<!-- <staticContent>
<mimeMap fileExtension=".json" mimeType="application/json" />
</staticContent> -->
<handlers>
<remove name="aspNetCore" />
</handlers>
</system.webServer>
</location>
</configuration>
Надеюсь, это поможет любому, кто оказался в подобной ситуации, поскольку нам потребовалось много проб и ошибок.
Я думаю, что давать общие настройки только для одного файла нехорошо. Я использовал следующий подход.
<httpErrors errorMode="Custom">
<remove statusCode="404"/>
<error statusCode="404" path="/PageNotFound.aspx" responseMode="ExecuteURL"/>
</httpErrors>
В этом обработчике я проверяю конкретный запрос файла и выполняю rersponse.write для обслуживания json-содержимого.
поэтому настройки сервера не нарушены.
if(Request.Url.ToString().ToLower().EndsWith("/apple-app-site-association"))
{
Response.Write(File.ReadAllText("/apple-app-site-association"));
Response.ContentType = "text/json";
Response.Flush();
Response.End();
}
В моем случае при размещении виртуального каталога на сервере iis возникла ошибка внутреннего сервера 500. Это было исправлено с помощью приведенной ниже конфигурации в файле web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<staticContent>
<mimeMap fileExtension="." mimeType="application/json" />
</staticContent>
<urlCompression doStaticCompression="false" doDynamicCompression="false" />
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
Зачем
Из соображений безопасности IIS не может разрешить просмотр любого файла. Imaging, например, web.config
,
Как
Самый быстрый способ - добавить тип файла к известным типам по его расширению:
Open IIS Manager -> Sites -> Your Web Site -> MIME TYPES -> Add...
File name extension=.
MIME type=application/json
-> OK
Теперь это работает.