Apache перезаписывает, не перенаправляя


У меня есть это в моем файле .htaccess:

RewriteEngine on

RewriteRule ^images/chart\.png$    /static/images/chart.png    [L,R=301]
RewriteRule ^images/artwork/(.+).png   /static/artwork/$1.jpg  [L,R=301]

# codeigniter
RewriteCond $1 !^(index\.php|static|images|admin|user_guide|sitemap\.xml\.gz|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

Часть CodeIgniter должна игнорировать папки images и static. Однако, когда я открываю example.com/images/chart.png Я получаю страницу CI 404. Другой 301 перенаправление работает нормально.

Не могу понять этого, у кого-нибудь есть какие-нибудь идеи?

Author: MrWhite, 2010-09-12

2 answers

Здесь происходит то, что ваша перезапись действительно работает, но R=301 вызывает вторую итерацию, которая вызывает 404.

Поступает запрос на images/chart.png, и ваши правила перезаписи начинают работать. Когда он совпадает с вашим первым правилом, это вызывает перенаправление 301. Это перенаправление 301 указывает браузеру выдать новый запрос для /static/images/chart.png.

Таким образом, новый запрос поступает на ваш сервер, и правила перезаписи выполняются снова. На этот раз запрос не соответствует ваши пользовательские правила вверху и превращают их в правило CodeIgniter. Поскольку ваш новый URL-адрес начинается со "статического", он соответствует правилу CI и перенаправляется на /index.php?/static/images/chart.png. Поскольку CI понятия не имеет, как с этим справиться (я полагаю), он выбрасывает 404, чтобы сообщить пользователю, что он не может найти ресурс.

Что вам нужно сделать, так это обновить правило CI, добавив следующие условия:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

Это подскажет mod_rewrite выполнять правило только в том случае, если запрос не относится к буквальному существующий файл (!-f) или каталог (!-d).

Как только это обновление будет сделано, первое правило вызовет такое же перенаправление для /static/images/chart.png, но поскольку этот файл буквально существует по этому пути, правила CI оставят его в покое, и новая перезапись не будет выполнена. Затем сервер будет обслуживать изображение в обычном режиме.

 0
Author: AgentConundrum, 2010-09-13 00:26:21

В конце концов мне удалось исправить это самостоятельно, удалив каталог изображений из предложения CI RewriteCond. (Все еще не на 100% уверен, почему это сработало, потому что запрос на images/chart.png даже не должен был попасть в часть CI.)

 0
Author: DisgruntledGoat, 2010-09-13 11:27:37