Regra de Regravação: anexando um caminho ao URL

2

Atualizar

Obrigado por todas as respostas até agora. Gostaria de esclarecer que o número após user (por exemplo, user1) no meu exemplo não é significativo. O usuário pode ser qualquer nome alfanumérico.

Eu quero ter certeza de que, se um diretório for especificado, adicionaremos "/faces/main.jsf" ao final dele.

Por exemplo

Queremos que a URL se pareça com:

example.com/user1/faces/main.jsf

O sistema pode acrescentar coisas como (o que devemos permitir)

 http://example.com/user1/faces/main.jsf;jsessionid=Z_DV-bY6MuQGlIvflPwgdKDk60cNzOkWXbC5G18ILrjR0jKoGWnd!-617980607

Se um pedido se parece com um destes:

example.com/user1
example.com/user1/

Eu gostaria que "/faces/main.jsf" fosse anexado a ele. O que há de errado com minhas regras de reescrita?

<VirtualHost *:80>
    ServerName          example.com
    ProxyPass           /       http://1.example.com:8888/
    ProxyPassReverse    /       http://1.example.com:8888/
    RewriteEngine       On
    # RewriteLog          /tmp/rewrite.log

    RewriteCond %{HTTP_HOST} !^example.com$
    RewriteRule !^/(.) http://example.com/$1 [L,R]

    RewriteCond %{REQUEST_URI}  !^/(.+/)faces/main.jsf.*
    RewriteRule !^(.+)/faces/main.jsf.*$  $1/faces/main.jsf [L,R]
</VirtualHost>
    
por Felipe Alvarez 26.06.2014 / 04:24

5 respostas

1

Estou assumindo que você deseja fazer proxy de todas as solicitações para o outro host que você está usando na configuração de proxy. Portanto, você deve combinar as duas tarefas em um único conjunto de diretivas da seguinte forma:

<VirtualHost *:80>
    ServerName          example.com
    RewriteEngine       On

    RewriteCond %{REQUEST_URI}  !^/(.+/)faces/main.jsf
    RewriteRule ^(.+?)(;.*) http://1.example.com:8888/$1/faces/main.jsf$2 [P]
    ProxyPassReverse / http://1.example.com:8888/
</VirtualHost>

Se você quiser reescrever apenas URLs específicos, como "/ userX", poderá adaptar facilmente a expressão regular acima.

    
por 03.07.2014 / 16:56
2

Tente isso

<VirtualHost *:80>
    ServerName          example.com
    ProxyPass           /       http://1.example.com:8888/
    ProxyPassReverse    /       http://1.example.com:8888/
    RewriteEngine       On
    # RewriteLog          /tmp/rewrite.log

    RewriteBase /

    RewriteCond %{HTTP_HOST} !^example.com$
    RewriteRule !^/(.) http://example.com/$1 [L,R]

    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^(user\d/)$  $1faces/main.jsf [L,R]
</VirtualHost>

Isso funcionará para user0..user9, mas não para user10. Se isso for um problema, altere a última regra de reescrita para usar ^ (user \ d + /) $

    
por 30.06.2014 / 13:19
1
<VirtualHost *:80>
 ServerName example.com

 RewriteEngine On
 RewriteRule ^/user1/(.*) http://1.example.com:8888/user1/faces/main.jsf$1 [L,P]
 RewriteRule ^/user1(.*) http://1.example.com:8888/user1/faces/main.jsf$1 [L,P]
 RewriteRule ^/(.*) http://1.example.com:8888/$1 [L,P]
</VirtualHost>

por exemplo:

link - > link

link - > link

link - > link

link

- >

link

O [P] fará o proxy dos pedidos para e do seu back-end.

Deve ser isso, a menos que você pretenda / user2 - > / user9 para também funcionar, se for o caso diga exatamente exatamente o que você está procurando para que eu possa dar as regras corretas: -)

Para o acima funcionar, você vai precisar do proxy, proxy_http e reescrever mods habilitados.

    
por 03.07.2014 / 17:42
1

Isso deve funcionar para um diretório de primeiro nível com caracteres alfanuméricos.

<VirtualHost *:80>
    ServerName          example.com
    ProxyPass           /       http://1.example.com:8888/
    ProxyPassReverse    /       http://1.example.com:8888/
    RewriteEngine       On
    # RewriteLog          /tmp/rewrite.log

    RewriteCond %{HTTP_HOST} !^example.com$
    RewriteRule ^/(.) http://example.com/$1 [L,R]

    RewriteRule ^/([a-z0-9]+)/?$  /$1/faces/main.jsf [L,R,NC]
</VirtualHost>
    
por 06.07.2014 / 15:55
1

Você perguntou o que há de errado com suas regras de reescrita. Veja estas duas linhas na sua configuração:

RewriteCond %{REQUEST_URI}  !^/(.+/)faces/main.jsf.*
RewriteRule !^(.+)/faces/main.jsf.*$  $1/faces/main.jsf [L,R]

Sua regra RewriteCond corresponderá se o URL ainda não tiver o bit faces / main.jsf. Isso parece bem. Seu RewriteRule não deve estar tentando combinar /faces/main.jsf. Eu realmente não tenho certeza do que você espera que aconteça com o líder '!' nesse padrão.

Talvez você queira algo assim:

RewriteCond %{REQUEST_URI}  !^/(.+/)faces/main.jsf.*
RewriteRule ([^;]*)(;.*)? $1/faces/main.jsf$2 [L,R]]

Sua construção com o ';' é bastante incomum, e se eu vi em um sistema eu estaria checando que isso é realmente o que é desejado (embora essa não tenha sido sua pergunta). UMA ';' após um '?' pode ser usado da mesma maneira que um '&', o que reduz a necessidade de escapar em html. Foi o que você quis dizer? Se assim for, então você deve saber que a parte da URL após o '? não faz parte do que é alimentado no RewriteRule.

    
por 06.07.2014 / 19:42