Назад | Перейти на главную страницу

RewriteRule не работает с mod_userdir

Моя установка:

-

$ 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]