带有 htaccess 的 CakePHP 子域

Posted

技术标签:

【中文标题】带有 htaccess 的 CakePHP 子域【英文标题】:CakePHP subdomains with htaccess 【发布时间】:2015-07-12 04:27:25 【问题描述】:

我在其他应用程序的 htaccess 文件中使用以下规则将用户从文件夹重定向到子域,但在访问该子域时从该文件夹加载内容。

# REWRITE SUBDOMAIN TO FOLDER
RewriteCond %HTTP_HOST ^admin\.cameron\.com$
RewriteRule !^admin/? admin%REQUEST_URI [NC,L]

# REWRITE FOLDER TO SUBDOMAIN
RewriteCond %THE_REQUEST \s/admin/([^\s]*) [NC]
RewriteRule ^ http://admin.cameron.com/%1 [R=301,L]

所以如果我去:http://cameron.com/admin 我最终会在http://admin.cameron.com/

但是内容是从http://cameron.com/admin加载的

但是这对 Cakephp 2.x 不起作用,因为它显然是重写...

/app/webroot 的 htaccess 文件中,我有:

<IfModule mod_rewrite.c>

    RewriteEngine On

    # CAKEPHP RULES
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^(.*)$ index.php [QSA,L]

    # REWRITE SUBDOMAIN TO FOLDER
    RewriteCond %HTTP_HOST ^admin\.cameron\.com$
    RewriteRule !^admin/? admin%REQUEST_URI [NC,L]

    # REWRITE FOLDER TO SUBDOMAIN
    RewriteCond %THE_REQUEST \s/admin/([^\s]*) [NC]
    RewriteRule ^ http://admin.cameron.com/%1 [R=301,L]

</IfModule>

如果我转到:http://cameron.com/admin,它只会尝试加载 AdminController 而不会重定向您,如果我转到:http://admin.cameron.com/,我只会收到 500 内部服务器错误。

关于如何让它在 CakePHP 上工作的任何想法?

【问题讨论】:

如果我是对的,您是否只想将 url 更改为指向子域的 url? 尝试在您的 webroot .htaccess 文件中的 RewriteEngine On 之后添加此语句 RewriteBase /app/webroot 【参考方案1】:

CakePHP 和几乎任何其他 PHP 框架都会解析 $_SERVER['REQUEST_URI'] 以便将您的请求路由到特定控制器

更多信息在这里:https://github.com/cakephp/cakephp/blob/2.6/lib/Cake/Network/CakeRequest.php#L230,

因此,您只需为重定向提供相同的请求 URI 参数即可使应用正常运行。

对于您的旧位置是“/admin”,对于新位置应该是相同的,但您不想传递它,所以最好像这样更改任务:

“当您访问 admin.site.com 时,您将被重定向到 site.com/admin”。

这可以像这样简单地完成:

RewriteRule ^([^.]+)\.example\.com http://example.com/$1

这不是规则的工作示例,因为您还需要重写子域的请求 URI 以使一切正常,这取决于您的要求,但可以是这样的:

RewriteRule ^([^.]+)\.example\.com(.*) http://example.com/$1/$2

UPD:真实示例

$ cat app/webroot/.htaccess 
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %REQUEST_FILENAME !-d
    RewriteCond %REQUEST_FILENAME !-f
    RewriteRule ^ index.php [L]
    RewriteCond %HTTP_HOST ^admin.example.com
    RewriteRule ^(.*)$ http://example.com/admin/$1 [P,L,NC]
</IfModule>

【讨论】:

您有完整的 htaccess 示例吗?因为我的规则在与 CakePHP 一起使用之前有效,这就是问题所在。 $ cat app/webroot/.htaccess &lt;IfModule mod_rewrite.c&gt; RewriteEngine On RewriteCond %REQUEST_FILENAME !-d RewriteCond %REQUEST_FILENAME !-f RewriteRule ^ index.php [L] RewriteCond %HTTP_HOST ^admin.cake.local RewriteRule ^(.*)$ http://cake.local/admin/$1 [P,L,NC] &lt;/IfModule&gt; 我也用以前评论的更易读的版本更新了答案【参考方案2】:
  <IfModule mod_rewrite.c>
  #standard cake htaccess stuff
  ...

  RewriteCond %HTTP_HOST ^profile\.thechatfun\.com$ [NC]
  RewriteRule ^(.*)$ http://www.thechatfun.com/users/profile/$1 [R=301,L]

  RewriteCond %HTTP_HOST ^chat\.thechatfun\.com$ [NC]
  RewriteRule ^(.*)$ http://www.thechatfun.com/chats/index/$1 [R=301,L]

</IfModule>

【讨论】:

以上是关于带有 htaccess 的 CakePHP 子域的主要内容,如果未能解决你的问题,请参考以下文章

根据 .htaccess 中的域/子域更改 DirectoryIndex

如何在 CakePHP 中创建子域?

cakephp 的 .htaccess

根目录中的 Wordpress htaccess 覆盖子域中的 htaccess。子域应用程序现在无法运行

htaccess中的子域重定向[关闭]

.htaccess 将子域重写到目录并将子域保留在 url