我想更改链接"http://blog.test.com/"到"http://www.test.com/blog/".
我在.htaccess 中尝试了以下代码
RewriteRule ^blog.test.com?$ test.com/blog [NC,R=301,L]
我错过什么了吗?感谢
如果您使用的是apache,则需要在RewriteCond:中匹配url的主机部分(例如blog.test.com)
RewriteCond %{HTTP_HOST} ^blog.test.com$ [NC]
RewriteRule ^(.*)$ http://www.test.com/blog/$1 [R=301,L]
首先,必须将HTML hrefs中的http://blog.test.com/whatever_or_empty
替换为http://www.test.com/blog/whatever_or_empty
。
blog.test.com
虽然是子域,但却是不同的URL。即当RewriteRule重写到另一个URL时,将发生外部重定向。这将反映在浏览器中。成为临时redirect(302(the default))
或permanent redirect(301)
。
因此,使用url重写将链接http://blog.test.com/
更改为http://www.test.com/blog/
是无用的。
尽管如此,您可以使用Apache模块mod_proxy来实现这一点。
Apache代理模块具有以下功能:
- mod_proxy:核心模块处理代理基础设施、配置和管理代理请求
- mod_proxy_http:它使用http和HTTPS处理获取文档
- mod_proxy_ftp:它处理通过ftp获取文档
- mod_proxy_connect:它处理用于安全(SSL)隧道的connect方法
- mod_proxy_ajp:它处理Tomcat和类似后端服务器的ajp协议
- modproxybalancer通过多个后端实现集群和负载平衡
- mod_cache、mod_disk_cache和mod_mem_cache:它们处理文档缓存的管理。要启用缓存,需要mod_cache以及disk_cache和mem_cache中的一个或两个
- mod_proxy_html:这将html链接重写到代理的地址空间中
- mod_xml2enc:这支持代表mod_proxy_html和其他标记过滤模块的国际化(i18n)。空间
- mod_headers:这将修改HTTP请求和响应标头
- mod_deflate:与客户端和后端协商压缩
您至少需要启用mod_proxy
和mod_proxy_http
模块,代理才能工作:
在apache的conf
文件中应该有类似的行:
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_module modules/mod_proxy.so
在http://www.test.com
的Virtualhost
中使用
ProxyPass /blog http://blog.test.com
ProxyPassReverse /blog http://blog.test.com
ProxyRequests On
ProxyVia On
<Proxy *>
Order allow,deny
Allow from all
</Proxy>
定义:
- ProxyPassApache文档
- ProxyPassReverseApache文档
- ProxyRequestsApache文档
- ProxyviaApache文档
您也可以将缓存与mod_cache
:mod_cache
一起使用
有关缓存的更多信息,请参阅此处:mod_cacheApache Docs。