Моя установка:
-
$ 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
Используя mod_userdir, который перенаправляет на /home/*/www
У меня есть файл .htaccess в /home/*/www/styles
со следующими директивами:
RewriteEngine On
RewriteRule (styles-files/.+)\.(\d{10})\.(\w{2,4})$ $1.$3 [L]
А теперь запутанная часть (личные данные замаскированы)
Загрузка http://localhost/~***/styles/styles-files/css/jquery.qtip.css
работает корректно (файл отображается в браузере)
Загрузка http://localhost/~***/styles/styles-files/css/jquery.qtip.1376640525.css
дает мне ошибку 404, но в сообщении говорится, что "/home/***/www/styles/styles-files/css/jquery.qtip.css" не найден, поэтому похоже, что выполняется перенаправление. И это правильный путь к файлу.
Журнал перезаписи показывает:
(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]
но сразу после этого Apache выдает ошибку, говоря
[error] [client 127.0.0.1] File does not exist: /var/www/home
Перезапись работает правильно, если я перенесу все в /var/www
. Кажется, есть какое-то столкновение между mod_rewrite и mod_userdir, но я ничего не могу найти об этом в Интернете.
Есть мысли о том, что здесь может происходить и как я могу это исправить?
После некоторого чтения я понял, что, поскольку RewriteRule находится в файле .htaccess, результирующая подстановка обрабатывается как URL-путь, а не путь файловой системы из-за неявного флага PT.
Добавление директивы RewriteBase сделало эту работу, но для меня это не удовлетворительное решение, потому что я хочу, чтобы это было переносимым.
В документы дальнейший намек на то, что
Единственный способ обойти [флаг PT] - это переписать его на -.
Но я не смог заставить это работать, добавив
RewriteRule .* - [L]
и удаление [L] из предыдущего правила.
Я смог решить эту проблему, используя RewriteCond
и %{REQUEST_URI}
что позволило мне восстановить URL-адрес вместо того, чтобы возвращать системный путь к файлу в виде URL-адреса.
RewriteEngine On
RewriteCond %{REQUEST_URI} ^(/.*?)styles-files/
RewriteRule (styles-files/.+)\.(\d{10})\.(\w{2,4})$ %1$1.$3 [PT]