Apache Reverse Proxy

我们经常使用Nginx作为反向代理,而事实上Apache也一样可以.但配置似乎更繁琐一些.

由于在某些网络下Gravatar的SSL服务不可用,且部署本站点的VPS运行Ubuntu+Apache HTTP Server,因而决定使用Apache来搭建Gravatar镜像

提示:以下操作仅适用Ubuntu或其他Debian系的发行版,不适用任何RedHat系的发行版(e.g. RHEL、Fedora、CentOS);另需准备所用域名的SSL证书.


1.Reverse Proxy的搭建

启用Proxy相关的Module

a2enmod proxy
a2enmod proxy_http

建立并编辑配置文件

touch /etc/apache2/sites-available/gr.hr98.xyz.conf
vim /etc/apache2/sites-available/gr.hr98.xyz.conf
<VirtualHost *:80>
	ServerName gr.hr98.xyz
	#301 Redirect至HTTPS链接
	RewriteEngine On
	RewriteCond %{HTTPS} off
	RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
<VirtualHost *:443>
	ServerName gr.hr98.xyz
 
	#优先使用HTTP/2
	ProtocolsHonorOrder On
	Protocols h2 http/1.1
	
	#HSTS Header
	Header always set Strict-Transport-Security "max-age=31536000;"
	
	ProxyRequests Off
	ProxyPreserveHost On
 
	#定义SSL证书与私钥
	SSLCertificateFile /etc/letsencrypt/live/gr.hr98.xyz/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/gr.hr98.xyz/privkey.pem
 
	#校验源站点SSL证书的Common Name和有效期
	#如源站点SSL证书由多个可选DNS Name且源站点域名与证书的Common Name不一致
	#将SSLProxyCheckPeerCN设为Off
	SSLProxyEngine On
	SSLProxyCheckPeerCN On
	SSLProxyCheckPeerExpire On
	SSLProxyVerify none
 
	#设置反向代理的本地路径和源站点路径
	ProxyPass "/"  "https://secure.gravatar.com/"
	ProxyPassReverse "/"  "https://secure.gravatar.com/"
 
	<Proxy *>
	Order Allow,Deny
	Allow from all
	</Proxy>
 
	#定义错误日志与(自定义格式的)访问日志
	ErrorLog /var/log/apache2/gr.hr98.xyz.error.log
	CustomLog /var/log/apache2/gr.hr98.xyz.access.log combined
</VirtualHost>

启用该Virtual Host

a2ensite gr.hr98.xyz.conf
/etc/init.d/apache2 restart

2.在WordPress中替换Gravatar链接

在当前主题/启用的插件的function.php中添加如下内容,当然也可以自行建立一个插件来添加

#Gravatar Reverse Proxy
function wp_gravatar_mirror($avatar) {
    $avatar = str_replace(array("www.gravatar.com", "0.gravatar.com", "1.gravatar.com", "2.gravatar.com","secure.gravatar.com"), "gr.hr98.xyz", $avatar);
    #$avatar = str_replace("http", "https", $avatar);
    return $avatar;
}
add_filter('get_avatar', 'wp_gravatar_mirror');

3.基于HTTP referer的访问控制

如果不想让其他站点使用你搭建的Reverse Proxy,可以配置基于HTTP referer的访问控制,其原理与『防盗图』相仿.

修改配置文件,在<VirtualHost *:443>……</VirtualHost>间添加以下内容

	#可以匹配多个站点的http和https链接作为白名单.
	#"^"在正则表达式中代表以其后的内容为开头.
	SetEnvIfNoCase Referer "^(http|https)://hardrain980.com" allowed_site
	SetEnvIfNoCase Referer "^(http|https)://old.hardrain980.com" allowed_site
	#如希望允许空referer(即通过浏览器地址栏直接访问),则取消下一行的注释.
	#SetEnvIfNoCase Referer  "^$" allowed_site
	<Proxy *>
	Order Allow,Deny
	Allow from env=allowed_site
	</Proxy>

重新加载配置文件

systemctl reload apache2

如无意外,此时referer使用未在”白名单”中的站点访问时会返回HTTP 403(Forbidden)状态码,达到了访问控制的目的.