2010-12-10 28 views
47

Nie rozumiem nic o IIS, ale staram się rozwiązać ten problem przekierowanie wszystkich gości do domain.com/page do domain.com/page.htmlIIS URL Rewrite i Web.config

<?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> 

Pojawiło się kilka problemów:

  1. Nie wiem, gdzie umieścić plik. Istnieje katalog główny użytkownika i katalog htdocs, próbowałem obu, bez radości.
  2. Nie wiem nawet, czy konto może przepisać, próbuję to odkryć.
+0

Zawsze, chociaż nie mogę tego teraz używać ... ale na przyszłość, a może i pomagać innym :) –

Odpowiedz

99

1) Twój istniejący web.config: zadeklarowałeś przepisanie mapy .. ale nie utworzyłeś żadnych reguł, które będą z niego korzystać. RewriteMap na własną rękę nie robi absolutnie nic.

2) Poniżej jest to, jak można to zrobić (nie wykorzystują mapy przepisywania - tylko zasady, co jest dobre dla małej ilości przepisuje/przekierowywane):

Zasada ta zrobi SINGLE EXACT przepisać (wewnętrzne przekierowanie) /page do /page.html. URL w przeglądarce pozostanie niezmieniony.

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

Ta zasada nr 2 zrobi to samo co powyżej, ale będzie zrobić przekierowanie 301 (stałe przekierowanie), gdzie URL zmieni w przeglądarce.

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

Zasada # 3 będzie próbował wykonać taką przeróbkę dla dowolnego adresu URL, jeśli istnieje taki plik z rozszerzeniem .html (tj /page będzie sprawdzić, czy /page.html istnieje, a jeśli to nie nastąpi, a następnie przepisać):

<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> 
+2

Próbowałem zrozumieć te mapy, a twoja odpowiedź bardzo pomogła. Dzięki. Mój +1 – AYK

+2

@CodeSherpa Wierzę, że Tomek podał poprawne rozwiązanie: po prostu zmień: dodaj '' i może używaj '^ register \ .aspx $ '(zwróć uwagę na \ character - to zapewni, że tylko' register.aspx' zostanie przekierowany, a nie 'register2aspx' itd.). Ponadto - upewnij się, że ** Moduł URL Rewrite ** jest zainstalowany (jest oddzielny download = nie jest dołączony do IIS domyślnie). – LazyOne

+0

@LazyOne możesz mi pomóc na http://stackoverflow.com/questions/19904849/url-mapping-works-on-localhost-but-on-production-server-in-asp-net –

9

Wypróbowałem tę regułę i działało z hostingiem GoDaddy, ponieważ mają już zainstalowany moduł Przepisywania URL dla każdego konta IIS 7.

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

Dzięki wspomnieniom o instalowanym module zdałem sobie sprawę, że go nie zainstalowałem i udało mi się przezwyciężyć mój problem :) – lappy

12

Chciałem tylko zwrócić uwagę na jedną rzecz, brakuje w odpowiedzi LazyOne za (I byłby po prostu skomentował w ramach odpowiedzi, ale nie mają wystarczająco dużo rep)

W Zasada # 2 dla stałego przekierowania jest rzeczą brakuje :

redirectType="Permanent"

Tak Zasada # 2 powinna wyglądać następująco:

<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> 

Edit

Aby uzyskać więcej informacji na temat korzystania z URL Rewrite Module zobaczyć tę doskonałą dokumentację: URL Rewrite Module Configuration Reference

W odpowiedzi na pytanie z @kneidels komentarzach; Aby dopasować URL: topic.php?id=39 coś jak poniżej może być używany:

<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> 

To będzie pasował topic.php?id=ab gdzie a jest dowolną liczbą 0-9 i b jest również dowolną liczbę między 0-9. Następnie przekieruje do /newpage/xy, gdzie xy pochodzi z oryginalnego adresu URL. Nie testowałem tego, ale powinno działać.

+0

Hej. To rozwiązanie działa doskonale dla plików statis. Jak by wyglądał z dopasowanym adresem URL: 'match url =" topic.php? Id = 39 "'? – kneidels

+1

@kneidels: Właśnie zaktualizowałem odpowiedź, zobacz, czy to pomaga – Hjalti

Powiązane problemy