Регулярное выражение в Tuckey UrlRewrite

Я использую Tuckey URLRewrite, и мне нужно правило, которое принимает все, кроме "/" или "\"

Я написал правило, но tuckey показывает бесконечные исключения и не загружает страницу

    <rule>
        <from>^/post/([^/\n\\]+)/type/([a-z]+)$</from>
        <to>/post/?slug=$1&amp;type=$2</to>
    </rule>

Из regexr я убедился, что это выражение "([^/\n\]+)" выберет все, кроме "/" или "\" Но я получаю исключения. Я что-то упускаю?

Вот исключения:

at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:281)
    at org.tuckey.web.filters.urlrewrite.RuleBase.matchesBase(RuleBase.java:205)
    at org.tuckey.web.filters.urlrewrite.NormalRule.matches(NormalRule.java:92)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRuleProcessing(RuleChain.java:83)
    at org.tuckey.web.filters.urlrewrite.RuleChain.process(RuleChain.java:137)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:144)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:412)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
    at org.tuckey.web.filters.urlrewrite.NormalRewrittenUrl.doRewrite(NormalRewrittenUrl.java:213)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:171)

. . продолжается..


person iCurious    schedule 15.01.2015    source источник
comment
Как все, кроме / и ^/post/([^/\n\\]+)/type/([a-z]+)$, одинаковы?   -  person anubhava    schedule 15.01.2015
comment
Я не понял, что вы говорите, но я обновил свой вопрос   -  person iCurious    schedule 16.01.2015
comment
Какой URL вы ввели, когда получили это исключение?   -  person anubhava    schedule 16.01.2015
comment
это был localhost:8080/myapp/post-page. jsp/to-defeat-fear/type/random   -  person iCurious    schedule 16.01.2015
comment
Но ваше правило соответствует /post/ в начале, и у вас есть post-page.jsp?   -  person anubhava    schedule 16.01.2015
comment
о, это на самом деле localhost:8080/myapp/post/to-defeat-fear/type/random . Я изменил post-page.jsp для публикации в web.xml   -  person iCurious    schedule 16.01.2015
comment
Хорошо, сначала попробуйте простое регулярное выражение: <from>^/post/([^/]+)/type/([.+)$</from> и посмотрите, исчезнет ли исключение. Кстати, вы не предоставили здесь полную трассировку стека.   -  person anubhava    schedule 16.01.2015
comment
Давайте продолжим обсуждение в чате.   -  person iCurious    schedule 16.01.2015


Ответы (1)


У ОП были такие правила:

<rule> 
<from>^/post</from> 
<to>/post/</to> 
</rule> 

<rule> 
<from>^/post/([^/]+)</from> 
<to>/post/?slug=$1</to> 
</rule> 

<rule> 
<from>^/post/([^/]+)/type/([a-z]+)$</from> 
<to>/post/?slug=$1&amp;type=$2</to> 
</rule> 

Ясно, что проблема здесь в упорядочении правил. Начиная с первого шаблона: ^/post переопределяет все, что начинается с /post, и приводит к полному игнорированию нижеприведенных шаблонов, таких как ^/post/([^/]+)/type/([a-z]+)$.

Эти правила должны быть переупорядочены следующим образом:

<rule> 
<from>^/post/([^/]+)/type/([a-z]+)$</from> 
<to>/post/?slug=$1&amp;type=$2</to> 
</rule> 

<rule> 
<from>^/post/([^/]+)</from> 
<to>/post/?slug=$1</to> 
</rule> 

<rule> 
<from>^/post</from> 
<to>/post/</to> 
</rule> 

т. е. Сохраняйте правила универсального типа ниже конкретных целевых.

person anubhava    schedule 16.01.2015