我在本地网络中有一些网站,无法访问互联网。所以我想设置一台可以访问互联网的机器,并将其用作反向代理。
我的 apache 配置如下所示:
ProxyPass "/website1" "http://192.168.0.1/website1"
ProxyPassReverse "/website1" "http://192.168.0.1/website1"
因此,当我访问我的公共域 /website 1 时,它会将我重定向到 website1,但是当我单击那里的某个内容将我转发到 /website1/about 之类的内容时,它不起作用,因为源代码仍然说要转到http://192.168.0.1/website1/about,这在本地网络之外显然是不可能的。
那么,如何让 Apache 转发所有文件并重写路径?
或者一个更好的问题是,有没有比 apache 更好的东西可以做反向代理?
答案1
根据后端的功能,您有两个选择。
如果后端服务器使用请求的主机名修改 html 链接,您只需添加:
ProxyPreserveHost on
如果您想要修改响应中的“固定”html 链接的内容,您还需要“mod_proxy_html“功能,这是一个特定于此功能的 mod_proxy 子模块。
答案2
你不需要。ProxyPassReverse
仅用于重写重定向,而不是文件主体中某处的路径。这需要对内容格式(如 HTML、SOAP 等)有相当全面的了解,才能知道路径在哪里出现和被替换(例如<a href="...">
HTML 中的路径,还有<link>
、<script>
、 ......)。
您可能想要做的只是为不同的反向代理网站设置不同的 vHost,这样就不需要重写相对路径了。当然,如果某些链接包含域名(如果我正确理解您的问题,似乎就是这种情况),它也不会以这种方式工作,您“只需”在内部主机上配置网站以在链接中使用正确的外部域名。
答案3
我现在只是使用 nginx,它运行完美。
sub_filter_types text/css;
sub_filter_once off;
sub_filter '192.168.0.1' 'proxy.mydomain.com';
proxy_set_header Accept-Encoding "";
location /website1 {
proxy_pass http://192.168.0.1/website1;
}
location /website2 {
proxy_pass http://192.168.0.2/website2;
}
您甚至可能希望使用缓存来加快访问速度,然后添加以下内容:
proxy_cache_path /var/www/cache levels=1:2 keys_zone=nginx:10m;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;
proxy_cache nginx;
只需确保创建路径 /var/www/cache 或设置另一个现有路径
答案4
您忘记启用“RewriteEngine”请确保您已启用mod_proxy、mod_proxy_http 和mod_rewrite。
添加这个可能会解决它。
ProxyRequests off
RewriteEngine on
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
而且这些行看起来应该是这样的:
ProxyPass "/website1" "http://192.168.0.1/website1"
ProxyPassReverse "/website1" "http://192.168.0.1/website1"
RewriteRule ^/website1$ http://%{HTTP_HOST}/website1 [L,R=301]