IIS URL Rewrite и Web.config - PullRequest
       13

IIS URL Rewrite и Web.config

52 голосов
/ 10 декабря 2010

Я ничего не понимаю в IIS, но пытаюсь решить проблему перенаправления всех посетителей на domain.com/page domain.com/page.html

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <rewrite>
          <rewriteMaps>
              <rewriteMap name="StaticRedirects">
                  <add key="/page" value="/page.html" />
              </rewriteMap>
            </rewriteMaps>
      </rewrite>
  </system.webServer>
</configuration>

Возникает пара проблем:

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

Ответы [ 3 ]

111 голосов
/ 19 июля 2011

1) Ваш существующий web.config: вы объявили карту перезаписи .. но не создали никаких правил, которые будут ее использовать.RewriteMap сам по себе абсолютно ничего не делает.

2) Ниже описано, как вы можете это сделать (он не использует карты перезаписи - только правила, что подходит для небольшого количества переписываний / перенаправлений):

Это правило выполнит перезапись с ОДНОЙ ТОЧНОСТЬЮ (внутреннее перенаправление) /page до /page.html.URL в браузере останется неизменным.

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRewrite" stopProcessing="true">
                <match url="^page$" />
                <action type="Rewrite" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Это правило # 2 будет действовать так же, как указано выше, но будет выполнять перенаправление 301 (постоянное перенаправление), где URL будет изменяться в браузере.

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Правило № 3 будет пытаться выполнить такое переписывание для ЛЮБОГО URL, если существует такой файл с расширением .html (т. Е. Для /page оно проверит, существует ли /page.html, и если оно произойдет, тогда произойдет перезапись):

<system.webServer>
    <rewrite>
        <rules>
            <rule name="DynamicRewrite" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{REQUEST_FILENAME}\.html" matchType="IsFile" />
                </conditions>
                <action type="Rewrite" url="/{R:1}.html" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>
13 голосов
/ 13 декабря 2012

Просто хотел указать на одну вещь, отсутствующую в ответе LazyOne (я бы просто прокомментировал под ответом, но мне не хватило бы представителя)

В правиле № 2 для постоянного перенаправления отсутствует вещь:

redirectType="Permanent"

Итак, правило № 2 должно выглядеть так:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="SpecificRedirect" stopProcessing="true">
                <match url="^page$" />
                <action type="Redirect" url="/page.html" redirectType="Permanent" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

Редактировать

Подробнее о том, как использовать модуль перезаписи URL, см. В этой превосходной документации: Справочник по настройке модуля перезаписи URL

В ответ на вопрос @kneidels из комментариев; Чтобы соответствовать URL: topic.php?id=39 можно использовать что-то вроде следующего:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="SpecificRedirect" stopProcessing="true">
        <match url="^topic.php$" />
        <conditions logicalGrouping="MatchAll">
          <add input="{QUERY_STRING}" pattern="(?:id)=(\d{2})" />
        </conditions>
        <action type="Redirect" url="/newpage/{C:1}" appendQueryString="false" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

Это будет соответствовать topic.php?id=ab, где a - любое число от 0-9, а b - также любое число от 0-9. Затем он будет перенаправлен на /newpage/xy, где xy исходит от исходного URL. Я не проверял это, но оно должно работать.

10 голосов
/ 14 января 2012

Только что попробовал это правило, и оно работало с хостингом GoDaddy, так как у них уже был установлен модуль перезаписи URL-адресов Microsoft для каждой учетной записи IIS 7.

<rewrite>
  <rules>
    <rule name="enquiry" stopProcessing="true">
      <match url="^enquiry$" />
      <action type="Rewrite" url="/Enquiry.aspx" />
    </rule>
  </rules>
</rewrite>
...