2016-09-16 2 views
1

Я внедрил переписывание URL-адресов на уровне сервера, так как я хотел перенаправить все HTTP и HTTPS-запросы, которые соответствуют определенному правилу, на мой фактический сайт, а перенаправление должно выполняться только если пользователи попадают на мой фактический сайт. Сначала правила работают нормально. Однако повторное нажатие CTRL + R на моем фактическом сайте, как представляется, делает мой сайт недоступным. Ошибка «Эта страница не может быть отображена» затем возвращается пользователю. Этот тест был выполнен в браузере IE 11 на Windows x64, а мой веб-сервер - IIS 8.5 на Windows Server 2012 R2. Код ответа HTTP, возвращаемый для перенаправления, настроен как 307.URL Rewrite вызывает «Эта страница не может быть отображена»

Когда я включаю Fail Request Routing на моем сервере IIS, я вижу предупреждение об ошибке REWRITE_DISABLED_KERNEL_CACHE в журналах неудачных запросов. Это было время, когда страница возвращает «Эта страница не может быть отображена».

Отключение моего правила перезаписи URL-адресов немедленно приведет к тому, что мои HTTP и HTTPS-сайты будут доступны еще раз, и я подтвердил, что перенаправление больше не работает. Включение этого же правила после этого, но только на моем сайте HTTPS, будет работать.

Как следует это мое правило

<system.webServer> 
    ... 
    <rewrite> 
     <globalRules> 
      <clear /> 
      <rule name="HTTPS to HTTP" enabled="true" stopProcessing="true"> 
       <match url="^(downloads?/?)?$" /> 
       <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
        <add input="{REQUEST_URI}" pattern="http://.*?/downloads/" negate="true" /> 
       </conditions> 
       <action type="Redirect" url="http://{HTTP_HOST}/downloads/" appendQueryString="false" redirectType="Temporary" /> 
      </rule> 
     </globalRules> 
     <outboundRules> 
     </outboundRules> 
    </rewrite> 
    ... 
</system.webServer> 

Перенаправление В принципе, если запрос попадает любой из следующих примеров URL-адресов, я перенаправлять их:

1) http://fqdn/download

2) http://fqdn/download/

3) https://fqdn/downloads

4) https://fqdn/downloads/

5) https://fqdn/download

6) https://fqdn/download/

не будет перенаправлять, если запрос попадает мой сайт прямо:

Когда Я попал на мой фактический сайт, я понимаю, что r правило эдирекции все еще применяется. Поэтому я подозреваю, что здесь могут быть две разные проблемы.

1) Бесконечное правило перенаправления применяется, когда запросы направляются http://fqdn/downloads/

2) Какая-то неизвестная проблема с REWRITE_DISABLED_KERNEL_CACHE

ответ

0

Вы в ладах с бесконечными переадресовывает из-за вашей неправильной assumptation о REQUEST_URI и отсутствие HTTPS проверка.

{REQUEST_URI} содержит пути URL-адрес, включая строку запроса с слэшем (никогда не были welldocumented), никогда не содержит Uri схемы или имени хоста. Итак, у вас есть ложный позитив.

HTTP (s): // < хозяин >: < порт > /<path>?<querystring>

Вот само за себя правилом.

<rule name="Force Http downloads page" stopProcessing="true"> 

    <!-- If the url starts with download or downloads with an optional trailing slash --> 
    <match url="^downloads?/?$" /> 

    <!-- Redirect --> 
    <action type="Redirect" url="http://{HTTP_HOST}/downloads/" appendQueryString="false" redirectType="Temporary" /> 

    <!-- When --> 
    <conditions logicalGrouping="MatchAny"> 
     <!-- REQUEST_URI does not start with "/downloads/" --> 
     <add input="{REQUEST_URI}" pattern="^/downloads/" negate="true" /> 

     <!-- Or --> 

     <!-- HTTPS is not off --> 
     <add input="{HTTPS}" pattern="^off$" negate="true" /> 
    </conditions> 
</rule> 

Надеюсь, что это поможет.

+1

Wao вы спасатель жизни! Но я немного изменился. Вместо использования REQUEST_URI я переключился на использование URL-адреса, поэтому, по крайней мере, я использую переменную, которая более хорошо документирована. –

+0

@louisxie, поскольку нет строки запроса, это хороший вызов. –

+0

По какой-то причине новое правило не успешно перенаправляет https: // / и https: // /на мой предполагаемый сайт. Это связано с тем, что IIS оценивает условие {URL}, применяемое как true, но условие {HTTPS} является ложным. Поэтому я удалил все применяемые условия и заменил его

 Смежные вопросы

  • Нет связанных вопросов^_^