【问题标题】:htaccess - Rewriting requests for subdomain to a folder, with query stringhtaccess - 使用查询字符串将子域的请求重写到文件夹
【发布时间】:2011-06-01 05:16:09
【问题描述】:

我正在尝试使用 Apache htaccess 文件进行子域重写,需要一些帮助。

我正在尝试获取 http://xyz.example.com 的请求,就像用户已请求 >http://example.com/xyz,因此用户不会在地址栏中看到此 URL - 他们看到的是子域版本。

这会稍微复杂一点,因为后面的任何内容也需要传递,例如,如果用户请求 http://xyz。 example.com/test/word/?x=123 那么这需要由服务器处理,就好像他们访问过 http://example.com/xyz/ test/word/?x=123.

该站点在 Code Igniter 框架上运行,该框架也有自己的 htaccess 规则,但我想这种重写会在这些启动之前先完成。

任何帮助将不胜感激!

【问题讨论】:

  • 使用[QSA]传递GET参数
  • Codeigniter 是在站点根目录中,还是在 xyz 中?
  • 嗨 Tim - 代码点火器位于站点根目录 example.com。我有一个使用 A 记录创建的子域,该记录指向与此根域相同的 IP
  • 嗨 Pekka - 这听起来像是我需要的,但我不知道如何使用它

标签: .htaccess subdomain rewrite


【解决方案1】:

以下mod_rewrite 规则集应该执行您需要的重写:

RewriteCond $0 !^(index\.php/)?xyz
RewriteCond %{HTTP_HOST} ^xyz\.
RewriteRule ^.*$ /xyz/$0 [L]

查询字符串会自动传递,因为我们在重写时没有更改它。

但要让 CodeIgnitor 选择此更改,您需要使用 PATH_INFO 作为路由信息的来源。您的 $config['uri_protocol'] 需要设置为 PATH_INFOAUTO ,您的 CodeIgnitor RewriteRule 应该如下所示:

RewriteRule ^.*$ /index.php/$0

如果您在尝试使用PATH_INFO 时遇到问题,您需要找到一种方法让CodeIgnitor 解析$_SERVER['REDIRECT_URL'](并将L 标志添加到第一个RewriteRule 那里)。希望这不是必需的,但如果你不能让它工作,否则我会研究你如何做到这一点。

【讨论】:

  • 嗨,蒂姆,感谢您对此进行调查。然而奇怪的是,尽管设置了 PATH_INFO,但我收到了 403 禁止错误。在 error_log 中显示“文件名太长:无法将 GET / HTTP/1.1 映射到文件”。 CI RewriteRule 看起来确实略有不同,但即使将其更改为您的,它仍然无法正常工作。好消息是,与此同时,我的一位同事也在试验它——我们都在努力让它发挥作用! - 现在已经设法使用 RewriteCond %{HTTP_HOST} ^xyz\.example\.com$ [NC] RewriteRule ^(.*)$ example.com/xyz/$1 [P] 谢谢
  • @GSA - 是的,那是因为我没有考虑 CodeIgnitor 重写后会发生什么。为了完整起见,我已经更新了解决该场景的答案。您的同事使用P 标志的解决方案也很好;我刚刚避免建议这样做,因为它具有创建一个全新请求作为代理的一部分的开销。诚然,如果您的服务器没有受到压力,这不是问题。
猜你喜欢
  • 2011-03-02
  • 2011-10-07
  • 2015-11-11
  • 2017-03-06
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 2012-11-20
相关资源
最近更新 更多