Не удается использовать {HTTP_HOST} для нескольких правил перезаписи в файле web.config с хостингом GoDaddy - IIS 7.0
Я столкнулся со странной проблемой при создании нескольких правил переписывания для моего сайта, который размещается на GoDaddy. Я могу создать одно правило перезаписи, используя {HTTP_HOST}
или же {SERVER_NAME}
переменные, но во время добавления второго правила это выглядит как {HTTP_HOST}
/ {SERVER_NAME}
не возвращает значение (я полагаю), поэтому мой код не работает.
После небольшой ошибки я нашел способ обойти проблему (которую я добавлю внизу). Я задаю этот вопрос, потому что я хотел бы:
- Понять причину такого поведения
- Знайте, если это происходит с кем-то еще
- Выясните, ошибочен ли мой подход или я что-то упустил, чтобы это сработало
Из-за этой проблемы я решил очистить весь файл web.config для целей тестирования и использовать только правила перезаписи. Я пробовал несколько изменений, но я не могу вспомнить все из них в настоящее время, поэтому я добавлю столько, сколько я помню.
вопрос
Этот код работает
<system.webServer>
<rewrite>
<rules>
<rule name="Mask myFile.xml" stopProcessing="true" patternSyntax="Wildcard">
<!-- This rule always -->
<match url="*" />
<conditions>
<add input="{REQUEST_URI}" pattern="/myFile.xml" />
</conditions>
<action type="Rewrite" url="/SiteDependentFiles/{HTTP_HOST}/new_myFile.xml" appendQueryString="false"/>
</rule>
</rules>
</rewrite>
</system.webServer>
Этот код не (см. Примечания внутри кода)
<system.webServer>
<rewrite>
<rules>
<rule name="Mask myFile.xml" stopProcessing="true" patternSyntax="Wildcard">
<!-- This rule works on and off. When it doesn't work, it returns a 404 (Not found) error -->
<match url="*" />
<conditions>
<add input="{REQUEST_URI}" pattern="/myFile.xml" />
</conditions>
<action type="Rewrite" url="/SiteDependentFiles/{HTTP_HOST}/new_myFile.xml" appendQueryString="false"/>
</rule>
<rule name="Mask thisThingy.txt" stopProcessing="true" patternSyntax="Wildcard">
<!-- This rule never works and it returns a 500 (Internal Server) error -->
<match url="*" />
<conditions>
<add input="{REQUEST_URI}" pattern="/thisThingy.txt" />
</conditions>
<action type="Rewrite" url="/SiteDependentFiles/{HTTP_HOST}/new_thisThingy.txt" appendQueryString="false"/>
</rule>
</rules>
</rewrite>
</system.webServer>
Это то, что я получаю в "подробном отчете"
Ошибка 404.0 - Подробности
- Модуль: IIS Web Core
- Уведомление: MapRequestHandler
- Обработчик: StaticFile
- Код ошибки: 0x80070002
- Запрашиваемый URL: http://mySiteName.com:80/myFile.xml
- Физический путь: D: \ Hosting \ 123123123 \ html \ myFile.xml
- Метод входа: анонимный
- Пользователь входа: Аноним
Ошибка 500.0 - Подробности
- Модуль: ServerSideIncludeModule
- Уведомление: ExecuteRequestHandler
- Обработчик: SSI-html
- Код ошибки: 0x80070002
- Запрашиваемый URL: http://mysitename.com/thisThingy.txt
- Физический путь: D: \ Hosting \ 123123123 \ html \ thisThingy.txt
- Метод входа: анонимный
- Пользователь входа: Аноним
Теперь, если изменить {HTTP_HOST}
только для строки во втором правиле оба правила начинают работать:
<action type="Rewrite" url="/SiteDependentFiles/StaticFolderName/new_thisThingy.txt" appendQueryString="false"/>
Пожалуйста, обратите внимание:
Я также пытался использовать другой patternSyntax
вариант, Redirect
вместо Rewrite
, stopProcessing="false"
, используемый {SERVER_NAME}
вместо {HTTP_HOST}
, добавил <clear />
до первого правила, но ничего не меняется. Такое же поведение
Временное решение
Всегда добавляйте условие правила с {HTTP_HOST}
быть в состоянии использовать {SERVER_NAME}
как переменная для действия правила
<system.webServer>
<rewrite>
<rules>
<clear />
<!--
ALWAYS ADD <add input="{HTTP_HOST}" pattern="*" /> TO BE
ABLE TO USE {SERVER_NAME} MULTIPLE TIMES. (GODADDY ISSUE)
-->
<rule name="Mask myFile.xml" stopProcessing="true" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{HTTP_HOST}" pattern="*" />
<add input="{REQUEST_URI}" pattern="/myFile.xml" />
</conditions>
<action type="Rewrite" url="/SiteDependentFiles/{SERVER_NAME}/new_myFile.xml" appendQueryString="false"/>
</rule>
<rule name="Mask thisThingy.txt" stopProcessing="true" patternSyntax="Wildcard">
<match url="*" />
<conditions>
<add input="{HTTP_HOST}" pattern="*" />
<add input="{REQUEST_URI}" pattern="/thisThingy.txt" />
</conditions>
<action type="Rewrite" url="/SiteDependentFiles/{SERVER_NAME}/new_thisThingy.txt" appendQueryString="false"/>
</rule>
</rules>
</rewrite>
</system.webServer>
Пожалуйста, обратите внимание:
- я использую
{HTTP_HOST}
а также{SERVER_NAME}
, но используя только{HTTP_HOST}
может работать Я не могу проверить это прямо сейчас.