重写规则以从生产环境加载图像不起任何作用

时间:2019-09-06 作者:Hashim Aziz

我正在尝试修改中给出的重写规则Develop Locally, Use Images from Production 在我的本地开发站点(在XAMPP上运行)上执行同样的操作。

这就是开发网站.htaccess 看起来,最后添加了代码段(显然,URL替换为example.com等效的URL):

<IfModule mod_php.c>
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300
</IfModule>

#START WORDPRESS

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/

# Redirect About and Library to first sub page 
RewriteRule ^about/?$ /wordpress/about/history/ [L,NC,R=301]
RewriteRule ^the-library/?$ /wordpress/the-library/gallery/ [L,NC,R=301]

RewriteRule ^index\\.php$ - [L]

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]
</IfModule>

#END WORDPRESS
重写规则似乎没有什么不同,无论是HTTPS还是HTTP版本的URL。对于开发人员站点不可用的图像不会显示,即使对于生产站点加载相同的图像也不会显示。

我也没有成功地尝试修改本文中的重写规则slightly different question 应用于Wordpress Multisite。

此外,我之前在stop Wordpress from modifying the .htaccess file, 所以我很确定这不是问题的原因。

我的重写规则有什么问题导致它失败?

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

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 包含第一个捕获的子组。在修订后的指令中,第一个捕获的子组仅包含图像文件扩展名。