Urls virtuais, path relativo, absoluto e proxy

A situacao eh a seguinte: no JForum eu tenho um esquema de “url amigavel”. Ou seja, ao inves dos links serem na forma

http://www.jforum.net/jforum.page?module=posts&action=list&start=15&topicId=300

eh possivel acessar simplesmente digitando

http://www.jforum.net/posts/list/15/300.page

Porem, obviamente nao existe a estrutura de diretorios “/posts/list/15”, o que me obrigou a usar a tag <base href="…"> do HTML para informar ao browser o diretorio raiz ( base ) do site, ficando algo como

&lt;base href=&quot;http&#58;//www.jforum.net&quot;&gt;

dessa forma, os links e paths de imagens podem ser escritos normalmente, usando <img src="templates/blah/images/logo.jpg>. Isso nao seria possivel sem a tag <base>, uma vez que o browser tentaria buscar na estrutura “/posts/list/15/templates/blah/images/logo.jpg”.

O uso de <base> funciona ok para a maior parte das situacoes, porem, ha alguns problemas quando o forum eh acessado via algum Rewrite de URL do webserver, como o mod_proxy do Apache.
Com o mod_proxy, eh possivel fazer algo no estilo

Host: https://server.externo.dominio.com

ProxyPass /forum http&#58;//localhost&#58;8080/jforum
ProxyReverse /forum http&#58;//localhost&#58;8080/jforum

Host: http://server.intranet

ProxyPass /forum http&#58;//localhost&#58;8080/jforum
ProxyReverse /forum http&#58;//localhost&#58;8080/jforum

Ou seja, eh feito um mapeamento nos servidores para que, se algum digitar /forum, o Apache redirecione, “por baixo dos panos”, para o Tomcat. E ai eh que da problema, uma vez que a tag base vai ficar com o valor

&lt;base href=&quot;http&#58;//localhost&#58;8080/jforum&quot;&gt;

sendo que o correto seria ficar com o valor do host origjnal.

Nesses casos ja eh usado mod_jk para integrar Tomcat e Apache, sem problemas. O ponto eh somemente quando usando essas configuracoes de proxy.

Alguem tem alguma ideia de como resolver / contornar esse problema, seja ele qual for?!? … Por enquanto, a unica ideia que me vem a cabeca seria desabilitar as "ulrs amigaveis’ e usar tudo na forma normal. Mas eh uma solucao que nao em agrada.

Rafael

Perai, o mod_rewrite esta reescrevendo a tag base? :shock:

Nao, nao eh usado mod_rewrite. O valor da tag <base>, atualmente, eh setado no braco, via arquivo de configuracao, mas daria no mesmo se pegasse o valor via codigo, usando o getContextPath(), getServerName() etc…

Talvez eu esteja lidando com a situacao da forma errada, ja que fiquei ‘viciado’ no problema. Pensei em usar paths relativos a contexto, na forma

&lt;img src=&quot;/meuContext/images/xxx.jpg&gt;

mas isso de qualquer forma obrigaria a URL original ser “/meuContexto” tambem, nao?!..

Rafael

Hmmm… cara, vc tem que pensar como o browser nessas horas…

Se voce esta na pagina /page/cv/index.html, e tem uma tag img apontando pra /images/foo.jpg, o browser vai fazer GET /images/foo.jpg. Ate ai, facil.

Se voce esta na pagina /page/cv/index.html, e tem uma tag img apontando pra …/images/foo.jpg, o browser vai fazer GET /page/images/foo.jpg. Beleza, tambem.

Se voce colocar um <base>, e poe /images/foo.jpg, voce ganha um GET /base/images/foo.jpg. Se voce colocar …/images/foo.jpg, eu ja nao sei o que acontece (fazer o que :D)

Entao, o problema eh basicamente o de sincronizar a tag <base> com o que o browser realmente recebe - ou seja, configurar a tag pra que ela mande pro cliente a URL base que o httpd esta redirecionando :wink:

Rafael, pq vc prefere esse URL amigável?

Como vc trata essa URL? Uma vez fiz isso em php e eu tinha que tratar tudo depois do /tagAmigavel/… com expressão regular. Com java nunca pensei em fazer isso. Gostaria de saber sua opinião sobre as vantagens disso.

valeu!

Richardson, esses dois links provavelmente respondem a sua pergunta :wink:

:arrow: https://urlrewrite.dev.java.net/

:arrow: http://www.useit.com/alertbox/990321.html

Interessante esse projeto URLRewrite…

Richardson, o segundo link do cv ja responde o resto :slight_smile:

No jforum eu fiz o meu proprio esquema para tratar essas urls, ate pq nao conhecia nenhum projeto para lidar com isso ( claro, tmb nao me dei ao trabalho de sequer pensar em procurar ).

De qualquer forma, eu basicamente defino um arquivo .properties com a url que eu quero, e entao, a cada request, quebro ela em partes em procuro por um padrao. Veja:

urlPattern.properties
https://jforum.dev.java.net/source/browse/jforum/WEB-INF/config/urlPattern.properties?rev=1.5&content-type=text/vnd.viewcvs-markup

ActionServletRequest.java: guarda os padroes e processa a url
https://jforum.dev.java.net/source/browse/jforum/src/net/jforum/ActionServletRequest.java?rev=1.6&content-type=text/vnd.viewcvs-markup

Funciona relativamente bem pras necessidades do sistema, ate o momento.

Rafael

Valeu pessoal, sua solução Rafael é bem parecida com a que eu fiz em php. Quando eu fiz eu queria facilitar para o usuário um link tipo www.site.com.br/hotsite. Essa era minha única motivação, por isso procurei saber a opinião de vcs.

Valeu!!