使用子域.htaccess进行无提示重写/重定向

时间:2017-06-04 19:12:12

标签: php apache .htaccess mod-rewrite apache2

我有结构:

public/test1
public/test1/a
public/test1/b

public/test2
public/test2/a
public/test2/b

我想重写/重定向如下:

test1.domain.com -> redirect to -> domain.com/test1 and user see -> test1.domain.com

test1.domain.com/a -> redirect to -> domain.com/test1/a and user see -> test1.domain.com/a

test2.domain.com -> redirect to -> domain.com/test2 and user see -> test2.domain.com

test2.domain.com/a -> redirect to -> domain.com/test2/a and user see -> test2.domain.com/a

所有重定向/重写都是静默的。我该如何解决?

1 个答案:

答案 0 :(得分:0)

如果主机名由同一个http服务器提供,则可以使用内部重写通过条件捕获所请求主机名的第一个标记:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.org$
RewriteRule ^/?(.*)$ /%1/$1 [END]

如果您运行的是非常旧版本的apache http服务器,那么您可能必须将END标志替换为L标志,这也应该适用于此情况。如果您遇到http状态500(服务器内部错误),请尝试该操作。在这种情况下,您也一定应该监视您的http服务器错误日志文件。

如果这两个主机名由服务于较短域名的同一个http服务器提供服务,那么最好的方法可能是使用内置代理模块在内部将请求转发给服务器。

一般提示:您应该始终更喜欢将此类规则放在http服务器(虚拟)主机配置中,而不是使用动态配置文件(.htaccess样式文件)。这些文件非常容易出错,难以调试,它们确实会降低服务器的速度。它们仅作为最后一个选项提供给您无法控制主机配置的情况(阅读:非常便宜的托管服务提供商),或者您有一个依赖于编写自己的重写规则的应用程序(这是一个明显的安全噩梦) )。