RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
# If images not found on development site, load from production
RewriteCond %{REQUEST_URI} ^/wp-content/uploads/[^\\/]*/.*$
RewriteRule ^(.*)$ https://www.example.com/$1 [QSA,L]
这里的问题是,“如果在开发站点上找不到图像”,那么请求已经重写为
index.php
根据前面的
RewriteRule
(WordPress前端控制器),所以后面的规则块不会执行任何操作。
注意:虽然您没有明确包括R
(redirect
) 上的标志RewriteRule
, 这将隐式触发外部302(临时)重定向,就像您显式包含R=302
在指令上。为了更清楚地传达其意图,最好明确地包含此标志。事实上,您可能希望将其更改为301,以便缓存图像,从而防止每次请求时外部重定向到生产服务器。
这个QSA
此处不需要标记,因为您没有在RewriteRule
替代。
旁白:您的RewriteRule
可以说匹配太匹配了。。。它匹配所有内容,而不仅仅是图像,这是故意的吗?
您可以通过以下方式解决此问题。。。
阻止前端控制器处理所有图像URL。例如,向WP front controller添加其他条件以排除图像:
RewriteCond %{REQUEST_URI} !\\.(jpe?g|png|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
或者,将重定向移动到WP front controller上方,并在重定向到生产服务器之前检查请求的文件是否不存在。我还将对regex和仅匹配图像(如上所述)进行更严格的限制,如果这是我的意图的话。例如:
RewriteRule ^index\\.php$ - [L]
# If images not found on development site, load from production
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^wp-content/uploads/[^/]+/.+\\.(jpe?g|png|gif)$ https://www.example.com/$0 [R=302,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
不需要附加条件,因为您可以在中执行URL比较
RewriteRule
模式(效率更高)。斜杠不需要在character类中转义(或在任何地方转义)。以及QSA
此处不需要标记(如上所述)。请注意,正则表达式匹配表单的URL路径/wp-content/uploads/<somedirectory>/<something>.jpg
, 哪里<something>
可以是任意数量的附加子目录。这是基于您的正则表达式。
这个$0
反向参考(与$1
是由RewriteRule
图案。$1
包含第一个捕获的子组。在修订后的指令中,第一个捕获的子组仅包含图像文件扩展名。