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

Моя настройка:

  • 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

Использование 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] из предыдущего правила.

1 ответ

Решение

Я смог решить это с помощью RewriteCond а также %{REQUEST_URI} что позволило мне восстановить URL вместо передачи системного пути к файлу как URL.

RewriteEngine On
RewriteCond %{REQUEST_URI} ^(/.*?)styles-files/
RewriteRule (styles-files/.+)\.(\d{10})\.(\w{2,4})$ %1$1.$3 [PT]
Другие вопросы по тегам