RewriteRule não funciona com mod_userdir

1

Minha configuração:

  • Ubuntu 13.04
  • Apache / 2.2.22 (Ubuntu)
  • PHP 5.4.9-4ubuntu2.2

-

$ ls /etc/apache2/mods-enabled/*.load
alias.load           auth_basic.load    authn_file.load    authz_default.load
authz_groupfile.load authz_host.load    authz_user.load    autoindex.load
cgi.load             deflate.load       dir.load env.load  expires.load mime.load
negotiation.load     php5.load          reqtimeout.load    rewrite.load
setenvif.load        status.load        userdir.load

Usando o mod_userdir, que redireciona para /home/*/www

Eu tenho um arquivo .htaccess em /home/*/www/styles com as seguintes diretivas:

RewriteEngine On
RewriteRule (styles-files/.+)\.(\d{10})\.(\w{2,4})$ $1.$3 [L]

Agora aqui está a parte confusa (detalhes pessoais mascarados)

Carregando http://localhost/~***/styles/styles-files/css/jquery.qtip.css funciona corretamente (o arquivo é exibido no navegador)

Carregando http://localhost/~***/styles/styles-files/css/jquery.qtip.1376640525.css me dá erro 404, mas a mensagem diz "/home/***/www/styles/styles-files/css/jquery.qtip.css" não encontrada, então parece estar redirecionando. E esse é o caminho correto para o arquivo.

Registo reescrito mostra:

(3) [perdir /home/***/www/styles/] strip per-dir prefix: /home/***/www/styles/styles-files/css/jquery.qtip.1376640525.css -> styles-files/css/jquery.qtip.1376640525.css
(3) [perdir /home/***/www/styles/] applying pattern '(styles-files/.+)\.(\d{10})\.(\w{2,4})$' to uri 'styles-files/css/jquery.qtip.1376640525.css'
(2) [perdir /home/***/www/styles/] rewrite 'styles-files/css/jquery.qtip.1376640525.css' -> 'styles-files/css/jquery.qtip.css'
(3) [perdir /home/***/www/styles/] add per-dir prefix: styles-files/css/jquery.qtip.css -> /home/***/www/styles/styles-files/css/jquery.qtip.css
(1) [perdir /home/***/www/styles/] internal redirect with /home/***/www/styles/styles-files/css/jquery.qtip.css [INTERNAL REDIRECT]

mas logo em seguida, o Apache lança um erro dizendo

[error] [client 127.0.0.1] File does not exist: /var/www/home

A reescrita funciona corretamente se eu mover tudo para /var/www . Parece haver algum tipo de conflito entre mod_rewrite e mod_userdir, mas não consigo encontrar nada sobre isso online.

Alguma opinião sobre o que pode estar acontecendo aqui e como posso consertar isso?

Depois de algumas leituras, percebi que, como o RewriteRule está em um arquivo .htaccess, a substituição resultante é tratada como um caminho de URL em vez de um caminho do sistema de arquivos devido ao sinalizador de PT implícito.

Adicionar uma diretiva RewriteBase fez isso funcionar, mas não é uma solução satisfatória para mim, porque quero que isso seja portátil.

Os documentos sugerem ainda que

The only way to circumvent [the PT flag] is to rewrite to -.

Mas eu não consegui fazer isso funcionar acrescentando

RewriteRule .* - [L]

e removendo o [L] da regra anterior.

    
por Aurimas 18.08.2013 / 11:21

1 resposta

1

Consegui resolver isso usando RewriteCond e %{REQUEST_URI} , o que me permitiu reconstruir a URL em vez de passar o caminho de arquivo do sistema como uma URL.

RewriteEngine On
RewriteCond %{REQUEST_URI} ^(/.*?)styles-files/
RewriteRule (styles-files/.+)\.(\d{10})\.(\w{2,4})$ %1$1.$3 [PT]
    
por 19.08.2013 / 03:09