我们正在使用 mod_rewrite 和 mod_proxy 将爬虫和机器人的请求代理到 prerender.io。prerender 服务目前不支持 https,但我的客户站点只支持 https,因此代理是从 https 到 http。这曾经运行良好,但自从我们更新到 Apache 2.4.29 以来,代理 URL 始终添加了端口 443。
Old: https://www.example.com/news/something -> http://service.prerender.io/https://www.example.com/news/something
New: https://www.example.com/news/something -> http://service.prerender.io:443/https://www.example.com/news/something
我怎样才能在不恢复 apache 的情况下恢复到以前的行为?
以下是 .htaccess 代码:
RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|baiduspider|rogerbot|embedly|quora\ link\ preview|showyoubot|outbrain [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yandex(Bot|Images|Video|Media) [NC,OR]
RewriteCond %{QUERY_STRING} _escaped_fragment_
RewriteRule ^(.*)$ http://service.prerender.io/https://%{HTTP_HOST}$1 [P,L]
答案1
答案非常直接和简单,这可能就是我错过它的原因。
只需将端口 80 添加到代理 URL 即可:
RewriteCond %{HTTP_USER_AGENT} googlebot|bingbot|baiduspider|rogerbot|embedly|quora\ link\ preview|showyoubot|outbrain [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yandex(Bot|Images|Video|Media) [NC,OR]
RewriteCond %{QUERY_STRING} _escaped_fragment_
RewriteRule ^(.*)$ http://service.prerender.io:80/https://%{HTTP_HOST}$1 [P,L]
答案2
我不知道 Apache 2.4.29 和 Apache 2.2 在这方面有什么区别,但是,如果您从 Apache 2.0(或更早版本?)升级,则默认值会发生变化。
如果你没有在替换 URL 中明确包含端口号,那么 Apache 2.2+ 将从ServerName
,UseCanonicalName
和UseCanonicalPhysicalPort
指令和/或请求。在 Apache 2.0 上默认对于UserCanonicalName
was On
(UseCanonicalPhysicalPort
只在 Apache 2.2 中引入) -Off
在 Apache 的后续版本中已更改为 - 因此,除非您明确设置它,否则它将使用来自请求的端口。
因此,如果您在服务器更新后遇到差异,那么我会怀疑其中一个指令发生了变化,除非您从非常旧的 Apache 版本升级。