UrlRewriteFilter Прямой к https - PullRequest
       24

UrlRewriteFilter Прямой к https

7 голосов
/ 02 августа 2010

Я использую UrlRewriteFilter для перенаправления на SSL.Я использую Glassfishv2.

Теперь мое правило выглядит примерно так.Это в моем urlrewrite.xml в WEB-INF моей военной папки.Существуют ли какие-либо другие настройки Glassfish, которые необходимо установить?

<rule>
        <condition name="host" operator="notequal">https://abc.def.com</condition>
     <condition name="host" operator="notequal">^$</condition>
     <from>^/(.*)</from>
     <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to>
    </rule>

Но FF постоянно говорит, что правило перенаправления URL-адресов выполняется так, что оно никогда не завершится.Я не совсем уверен, что здесь происходит.есть идеи?

Ответы [ 3 ]

11 голосов
/ 02 августа 2010

Я подозреваю, что проблема в том, что значение заголовка host (с которым вы сравниваете) не содержит схему, используемую для доступа к ресурсу, в отличие от значения сравнения. Это означает, что условие всегда выполняется, потому что хост никогда не равен тому, с чем вы его сравниваете, что приводит к бесконечному циклу перенаправления.

Глядя на документацию по UrlRewriteFilter, вы сможете сделать что-то подобное, чтобы получить то, что вы хотите:

<rule>
    <condition type="scheme" operator="notequal">https</condition>
    <condition name="host" operator="equal">abc.def.com</condition>
    <from>^/(.*)</from>
    <to type="permanent-redirect" last="true">https://abc.def.com/ghi/$1</to>
</rule>
0 голосов
/ 27 марта 2012

Я не совсем уверен, что не так с вашим примером выше, но это одна из тех прекрасных проблем, которые могут быть легко решены с помощью OCPsoft rewrite, другого открытого источника URLRewriteFilter :

@Override
public Configuration getConfiguration(final ServletContext context)
{

   return ConfigurationBuilder.begin()
     .defineRule()

     .when(Direction.isInbound()
         .and(Domain.matches("abc.def.com"))
         .and(Path.matches("/{path}").where("path").matches(".*"))
         .andNot(Scheme.matches("https"))
     .perform(Redirect.to("https://abc.def.com/{path}"));

}

Объект Scheme доступен с версии Rewrite 1.0.1: http://ocpsoft.org/rewrite/

0 голосов
/ 02 августа 2010

Значение имени хоста, указанное в правиле перезаписи URL, не может включать схему.UrlRewriteFilter внутренне использует методы API сервлета для определения имени хоста через request.getServerName () ;этот вызов метода никогда не возвращает схему, поэтому вам лучше выполнять проверку схемы отдельно (как и предполагал Тим).

Если вы заметили другие доступные методы, проверку схемы следует выполнить отдельно, так какСхема доступна только через метод request.getScheme () в API, который предоставляется отдельно через UrlRewriteFilter.

Реальная причина того, почему FF сообщает об ошибке перенаправления, вероятно, обусловленак множеству 302, отправляемых обратно клиенту, для первоначального запроса (и последующих запросов, сделанных клиентом).Возможно, вы захотите отслеживать трафик HTTP, чтобы определить, есть ли правило, которое присутствует при сбое перенаправления HTTPS, по фактической причине поведения в вашем приложении.

РЕДАКТИРОВАТЬ:

Если возможно, вы можете исследовать использование КОНФИДЕНЦИАЛЬНОГО элемента транспортной гарантии в файле web.xml, чтобы убедиться, что контейнер сервлета заставляет выполнять все HTTP-запросы по SSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...