【问题标题】:Silent rewrite / redirect with subdomain .htaccess使用子域 .htaccess 进行静默重写/重定向
【发布时间】:2017-11-05 13:44:03
【问题描述】:

我有结构:

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

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

【问题讨论】:

  • 请了解这个地方的运作方式:我们提供帮助,但您必须自己完成工作。我们不是来为你做你的工作。这意味着:开始自己,阅读主题。然后,如果您遇到自己无法解决的问题,那么是时候来到这里,通过发布您当前的尝试并指出确切的问题来询问。
  • 三个主机名(你称它们为“子域”)是否由同一个 http 服务器提供服务?

标签: php apache .htaccess mod-rewrite apache2


【解决方案1】:

如果主机名由同一个 http 服务器提供服务,那么您可以使用内部重写通过条件捕获请求的主机名的第一个令牌:

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

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

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

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

【讨论】:

  • 它不适用于我。它仍然重定向而不是保留原始网址。
  • 请确保您确实清空了浏览器缓存并重试。
  • 以上代码肯定不会执行外部重定向。所以问题是:你的情况有什么不同?您在 http 服务器错误日志文件中看到任何内容吗?访问日志文件显示什么?您在浏览器开发控制台的网络选项卡中看到什么响应?
  • With test1.domain.com -> result -> 在此服务器上找不到请求的 URL /test1/test1/index.html。
  • RewriteRule ^/?(.*)$ /%1/$1 [END],我认为它会重复子域。所以我尝试使用 RewriteRule ^/?(.*)$ /$1 [END],它适用于 url test1.domain.com/test1。这不是我想要的网址,而是重定向
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 2014-02-28
  • 2013-11-12
  • 2012-05-19
  • 2016-02-12
相关资源
最近更新 更多