Назад | Перейти на главную страницу

Почему эта перезапись IIS7 выполняет перенаправление?

У меня есть правило перезаписи, отвечающее перенаправлением 301, но я не знаю почему.

Я использую общий хостинг WinHost, использую перезапись IIS 7 для размещения другого домена, которым я владею, из подпапки моей учетной записи.

По умолчанию WinHost указывает другие ваши домены в корень вашей учетной записи. Итак, у меня двоякая цель:

  1. Я хочу, чтобы эти файлы других доменов были физически разделены во вложенной папке.
  2. Я хочу скрыть указанную подпапку из адресной строки

Так что:

http://myotherdomain.com

Обслуживается от:

E:\account_root\myotherdomain

Итак, используя модуль перезаписи IIS 7, я создал это правило.

<xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Test" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTP_HOST}" pattern="(^|\.)myotherdomain\.com$" />
                    </conditions>
                    <action type="Rewrite" url="myotherdomain/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Я хочу запросы на myotherdomain.com компенсировать myotherdomain подпапка.

Это работает, но только если в запросе нет путей. Если я прошу http://myotherdomain.com Я получаю ответ 200, и в моем браузере я вижу документ по умолчанию, расположенный по адресу E:\account_root\myotherdomain. Перенаправления не происходит.

Если вы добавите путь к запросу, например http://myotherdomain.com/test, теперь я получаю 301 редирект на перезаписанный URL:

Response: HTTP/1.1 301 Moved Permanently
Location: http://myotherdomain.com/myotherdomain/test/

Что браузер затем ПОЛУЧАЕТ:

Request: GET /myotherdomain/test/ HTTP/1.1

Затем правило перезаписи снова запускается в IIS, и в конечном итоге IIS пытается обслужить документ по умолчанию, расположенный по адресу:

E:\account_root\myotherdomain\myotherdomain\test

Чего не существует:

Response: HTTP/1.1 404 Not Found

Таким образом, похоже, что перезапись работает; я не понимаю, почему IIS добавляет 301 редирект в микс, но только тогда, когда в запросе есть путь.

Разве это не перенаправление для добавления конечного /?

Ваше правило выглядит правильным и, как вы предполагали, перезаписывает, а не перенаправляет. Мне кажется, что что-то еще на вашем сайте вызывает перенаправление 301 на стороне клиента. Попробуйте протестировать страницу .htm, чтобы увидеть, aspx или htm выполняет перенаправление. Ваше правило перезаписи URL этого не вызовет.

Вы на правильном пути. У меня есть пара сообщений в блоге об этой ситуации, включая исходящие правила: