服务端(apache)解决Javascript跨域问题
由于前端解决跨域问题的局限性比较大,对于 Ajax 跨域或是 iframe 跨域,建议用服务器端解决方案。
此方案的原理是接受客户端发来的请求后,经由本域服务器代理向目标服务器发送请求,并将响应数据返回给客户端。
用 apache 的 mod_proxy 模块开启反向代理功能来实现:
1 修改 apache 配置文件 httpd.conf ,去掉以下两行前面 # 号
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2 在 server config 或 virtual host 中增加:
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /folder http://****.com/floder
重启 apache.
注释:
ProxyRequests Off 指令是指采用反向(reverse)代理,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置;而正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为经过授权的客户端提供服务。
ProxyPass 指令允许将一个远端服务器映射到本地服务器的 URL 空间中,此时本地服务器并不充当代理角色,而是充当远程服务器的一个镜像。/folder 是一个本地虚拟路径,http://****.com/floder 是一个指向远程服务器的部分 URL
如果不想对某个子目录进行反向代理时,可以用"!"指令。比如说:
ProxyPass /folder/exception !
ProxyPass /folder http://****.com/floder
将会代理除 /folder/exception 之外的所有对 http://****.com/floder 的请求。
也可以用 URL 重写的方法来实现
1 修改 apache 配置文件 httpd.conf ,去掉以下三行前面 # 号
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
2 在 server config 或 virtual host 中增加:
<Location /folder>
SetHandler proxy-server
order allow,deny
Allow from all
</Location>
RewriteEngine on
RewriteRule ^/folder/(.*)$ http://****.com/floder [L,R=301,P,NC]
注释:
Location 指令提供了基于URL的访问控制,对于本域下的 /folder 目录下的任何资源的访问都会首先由proxy-server这个 handler(mod_proxy模块内部定义的一个 handler)来处理。
SetHandler proxy-server 指令是强制所有匹配的文件被一个代理服务器处理。
RewriteEngine on 指令是指打开重写引擎。
RewriteRule 指令是重写规则。
last|L 这个标记用于阻止当前已被重写的 URL 被后继规则再次重写。
redirect|R [=code] 若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向,是跨域或定向到外部域的必备良药。默认为 HTTP 响应码为 302, 我通常指定为301。
proxy|P 此标记使替换成分被内部地强制作为代理请求发送,表明该 rewrite 是通过 mod_proxy 代理过去,而不是通过外部重定向过去。
nocase|NC 忽略大小写,也就是在Pattern与当前 URL 匹配时,’A-Z’和’a-z’没有区别。
由于前端解决跨域问题的局限性比较大,对于 Ajax 跨域或是 iframe 跨域,建议用服务器端解决方案。
此方案的原理是接受客户端发来的请求后,经由本域服务器代理向目标服务器发送请求,并将响应数据返回给客户端。
用 apache 的 mod_proxy 模块开启反向代理功能来实现:
1 修改 apache 配置文件 httpd.conf ,去掉以下两行前面 # 号
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
2 在 server config 或 virtual host 中增加:
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /folder http://****.com/floder
重启 apache.
注释:
ProxyRequests Off 指令是指采用反向(reverse)代理,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置;而正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为经过授权的客户端提供服务。
ProxyPass 指令允许将一个远端服务器映射到本地服务器的 URL 空间中,此时本地服务器并不充当代理角色,而是充当远程服务器的一个镜像。/folder 是一个本地虚拟路径,http://****.com/floder 是一个指向远程服务器的部分 URL
如果不想对某个子目录进行反向代理时,可以用"!"指令。比如说:
ProxyPass /folder/exception !
ProxyPass /folder http://****.com/floder
将会代理除 /folder/exception 之外的所有对 http://****.com/floder 的请求。
也可以用 URL 重写的方法来实现
1 修改 apache 配置文件 httpd.conf ,去掉以下三行前面 # 号
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
2 在 server config 或 virtual host 中增加:
<Location /folder>
SetHandler proxy-server
order allow,deny
Allow from all
</Location>
RewriteEngine on
RewriteRule ^/folder/(.*)$ http://****.com/floder [L,R=301,P,NC]
注释:
Location 指令提供了基于URL的访问控制,对于本域下的 /folder 目录下的任何资源的访问都会首先由proxy-server这个 handler(mod_proxy模块内部定义的一个 handler)来处理。
SetHandler proxy-server 指令是强制所有匹配的文件被一个代理服务器处理。
RewriteEngine on 指令是指打开重写引擎。
RewriteRule 指令是重写规则。
last|L 这个标记用于阻止当前已被重写的 URL 被后继规则再次重写。
redirect|R [=code] 若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,可以强制性执行一个外部重定向,是跨域或定向到外部域的必备良药。默认为 HTTP 响应码为 302, 我通常指定为301。
proxy|P 此标记使替换成分被内部地强制作为代理请求发送,表明该 rewrite 是通过 mod_proxy 代理过去,而不是通过外部重定向过去。
nocase|NC 忽略大小写,也就是在Pattern与当前 URL 匹配时,’A-Z’和’a-z’没有区别。