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 перенаправление работает нормально.
Не могу понять этого, у кого-нибудь есть какие-нибудь идеи?
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 оставят его в покое, и новая перезапись не будет выполнена. Затем сервер будет обслуживать изображение в обычном режиме.
В конце концов мне удалось исправить это самостоятельно, удалив каталог изображений из предложения CI RewriteCond
. (Все еще не на 100% уверен, почему это сработало, потому что запрос на images/chart.png
даже не должен был попасть в часть CI.)