【问题标题】:Redirect subdomain to CakePHP action将子域重定向到 CakePHP 动作
【发布时间】:2018-05-12 02:49:15
【问题描述】:

背景

我有一个位于/m/ 的CakePHP 应用程序。我想编写一个根级.htaccess 文件,它将站点的“子域”作为参数重定向到操作。

例如:我想写一个重写规则,它会导致这样的重定向 -

  • http://mysite.myserver.comhttp://myserver.com/m/mysite/
  • http://mysite.myserver.com/homehttp://myserver.com/m/mysite/home
  • http://mysite.myserver.com/foo/bar?baz=truehttp://myserver.com/m/mysite/foo/bar?baz=true

理想情况下,此重定向应该对用户不可见(我不想使用 301,因为我不想更改 URL)。

这是我目前的尝试:

<IfModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^(.*)\.myserver\.com$ [NC]
  RewriteRule ^(.*)$ http://myserver.com/m/%1/$1 [L]
</IfModule>

据我所知,主要问题在于$_SERVER['REQUEST_URI']

  • 如果我直接浏览到http://myserver.com/m/mysite/home$_SERVER['REQUEST_URI'] = /m/mysite/home
  • 如果我使用上面的 .htaccess 文件浏览到 http://mysite.myserver.com/home$_SERVER['REQUEST_URI'] = /home

问题

由于$_SERVER['REQUEST_URI'] 的问题,我的路由无法正确解析:它试图根据需要将用户带到/home 而不是/m/mysite/home

如何更改我的重写规则以使其正常工作?有没有其他方法可以做到这一点?

【问题讨论】:

  • 嗯,现在不行,.htaccess 文件的写法。
  • 我不确定您认为$_SERVER['REQUEST_URI'] 的作用是什么,但这只是一个 PHP 常量,它包含域名后面的部分(例如 /index.php)。它与重写没有任何关系。快速浏览一下,您的 RewriteRule 中 /m/ 之后的 sites 位在您的问题的其余部分中没有提到,您确定它应该在那里吗?
  • @Oldskool:感谢您指出sites 位,但这只是一个错字。我指出$_SERVER['REQUEST_URI'] 的原因是,理想情况下,我想以某种方式“欺骗”它。我相信 CakePHP 正在使用该变量来解析路由,这就是为什么(即使我的 .htaccess 规则 technically 指向正确的 URL)它不起作用。有没有办法用.htaccess 规则来解决这个问题?

标签: php apache .htaccess cakephp mod-rewrite


【解决方案1】:

您的要求(更改 URL 中的域名但不要让浏览器看到 URL 更改)在正常情况下是无法实现的。然而,为了使它成为可能,你在你的 Apache 中有 enable mod_proxy 并重新启动它。完成后,在您的站点根目录 .htaccess 中使用以下代码:

RewriteCond %{HTTP_HOST} ^([^.]+)\.myserver\.com$ [NC]
RewriteRule !^m/ http://myserver.com/m/sites/%1%{REQUEST_URI} [NC,L,P]

【讨论】:

  • 这非常有效,并且完全满足了我的要求。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2012-07-22
  • 2021-05-29
  • 2011-08-27
相关资源
最近更新 更多