Как переписать URI в Grails в UrlMappings.groovy - PullRequest
3 голосов
/ 26 января 2012

Я бы хотел переписать URL в UrlMappings.groovy, например:

"/pub/cdn/$version/**"(uri: request.forwardURI.replaceFirst("/pub/cdn/[0-9]*", ""))

Так что запрос на:

/pub/cdn/1327516405188/css/login.css

например, будет переведено на:

/css/login.css

Идея состоит в том, чтобы взять исходный URI, удалить часть пути и передать новый URI.

Однако, используя приведенный выше код, я получаю сообщение об ошибке:

>    org.springframework.beans.factory.BeanCreationException: Error
>    creating bean with name 'grailsUrlMappingsHolder': Cannot resolve
>    reference to bean 'urlMappingsTargetSource' while setting bean
>    property 'targetSource'; nested exception is
>    ...
>    groovy.lang.MissingPropertyException: No such property: forwardURI for
>    class: java.lang.String

, что, по-видимому, означает, что объект запроса является строкой. Есть ли способ получить оригинальный URI в UrlMappings.groovy?

Метод "/ old / path" (uri: "/ new / path") работает до тех пор, пока новый путь жестко запрограммирован, но я не могу понять, как получить доступ к исходному запрошенному пути в качестве переменной внутри класса UrlMappings.

P.S. Я пытался заставить UrlMappings вызывать контроллер:

"/pub/cdn/$version/**" {
    controller = "image"
    action = "cdnRedirect"
}

и в контроллере:

def cdnRedirect = {
    def newUri = request.forwardURI?.toString().replaceFirst("/pub/cdn/[0-9]*", "")
    return redirect(uri: newUri)
}

Хотя закрытие контроллера вызывается правильно и URI переводится правильно, перенаправление, похоже, ничего не делает.

1 Ответ

2 голосов
/ 26 января 2012

Исходя из вашего примера, мне кажется, что вы решаете не ту проблему.Реальная проблема здесь заключается в том, что вы используете относительные ссылки (например, css/login.css) на статический контент.Когда браузер выбирает относительную ссылку, он использует текущий URL для определения пути к файлу.

Однако, если вы используете тег resource Grails , Grails создаст URL, которыйпривязан к корню URL.Например, ваша css/login.css ссылка станет /myAppName/css/login.css.

Использование выглядит примерно так:

<link type="text/css" href="${resource(dir: 'css', file: 'login.css')}" />

Это гарантирует, что независимо от контроллера, действия или другой идентификационной информации,ссылка на файл CSS всегда будет правильной.


Что касается того, почему ваш UrlMapping не работает, это потому, что он не обрабатывается динамически.Он обрабатывается во время запуска приложения, поэтому объект request в это время даже не существует.

Если вам абсолютно необходима система перезаписи URL, а использование контроллера для обработки ресурсов слишком сложно для этогоВ связи с этим, я рекомендую установить свой движок сервлетов (например, Tomcat) позади Apache и просто использовать mod_rewrite.Правильно спроектированный, однако, это действительно не должно быть необходимым.


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

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

...