Apache 重写使用 THE_REQUEST 仅重写 GET 请求

Apache 重写使用 THE_REQUEST 仅重写 GET 请求

背景:

为了减少包含 wordpress 安装的 git repos 的 repo 大小,我们将从 repo 中删除静态资产。大部分工作已经完成,但我遇到了一个问题。我已将资产重新定位到 S3 存储桶并使用 .htaccess RedirectPermanent,以便将对本地媒体的请求重定向到 s3 存储桶。这对于管理新位置的所有现有资产而无需修改 wp 数据库非常有用。但是,对于新添加的资产,我们使用“Amazon S3 和 Cloudfront”插件在将它们上传到服务器后自动将它们移动到同一个 S3 存储桶。但是,为了使其正常工作,我需要使用 THE_REQUEST 将我的 RedirectPermanent 更改为 RewriteRule,以便只有对媒体的 GET 请求指向 S3 存储桶。这是因为“Amazon S3 和 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 文件中的什么位置。

答案1

看起来我真的很接近了,并且把条件和规则放错了地方(它在底部,但应该在顶部)。

这是正在做的事情:

<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>

相关内容