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.