Задний план:
Чтобы уменьшить размер репозитория git-репозиториев, содержащих установки Wordpress, мы удаляем статические ресурсы из репо. Основная часть работы сделана, но у меня есть загвоздка. Я переместил ресурсы в корзину S3 и использовал .htaccess RedirectPermanent, чтобы запросы на локальные носители перенаправлялись в корзину s3. Это замечательно для управления всеми существующими активами, которые находятся на новом месте, без изменения базы данных wp. Однако для вновь добавленных ресурсов мы используем плагин Amazon S3 and Cloudfront, чтобы автоматически перемещать их в ту же корзину S3 после их загрузки на сервер. Однако для того, чтобы он работал, мне нужно изменить RedirectPermanent на RewriteRule с помощью THE_REQUEST, чтобы только запросы GET для мультимедиа указывались на ведро S3. Это связано с тем, что плагину Amazon S3 and Cloudfront необходимо разрешить локальную загрузку файла в виде кеша, из которого он отправляется в корзину S3.
Вот что у нас сейчас в .htaccess:
RedirectPermanent /media https://s3-us-west-2.amazonaws.com/bucket/media
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteRule ^assets/(.*) /wp-content/themes/theme/assets/$1 [QSA,L]
RewriteRule ^plugins/(.*) /wp-content/plugins/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Я плохо разбираюсь в правилах и условиях перезаписи Apache, я особенно слаб в области форматирования регулярных выражений для соответствия, и мой уровень опыта в написании правила перезаписи также мог бы быть лучше. Я прочитал несколько онлайн-примеров использования THE_REQUEST и знаю, что мне нужно что-то вроде:
#there's definitely more that I need here, but I don't know what I'm missing
RewriteCond %{THE_REQUEST} ^GET /media/(*)
#It kind of goes off the rails here, I'm very unsure of this syntax
RewriteRule ^media/(*) https://s3-us-west-2.amazonaws.com/fklassets/media/$1 [L]
Кроме того, я не уверен, где в файле .htaccess находятся новое условие и правило.
Похоже, я был очень близок и имел условие и правило не в том месте (оно было внизу, но должно было быть вверху).
Вот что работает:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^GET [NC]
RewriteRule ^media/(.*) http://s3-us-west-2.amazonaws.com/bucketname/media/$1 [QSA,NC,NE,R,L]
RewriteRule ^index\.php$ - [L]
RewriteRule ^assets/(.*) /wp-content/themes/themename/assets/$1 [QSA,L]
RewriteRule ^plugins/(.*) /wp-content/plugins/$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>