RewriteRule in .htaccess



我想更改链接"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_proxymod_proxy_http模块,代理才能工作:

在apache的conf文件中应该有类似的行:

LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_module modules/mod_proxy.so

http://www.test.comVirtualhost中使用

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

最新更新