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]