带有htaccess的CakePHP子域

Cam*_*ron 19 php apache .htaccess mod-rewrite cakephp

我在其他应用程序的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]
Run Code Online (Sandbox Code Playgroud)

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

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

但是这对CakePHP 2.x来说不起作用,因为它的重写显然......

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

<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>
Run Code Online (Sandbox Code Playgroud)

如果我去:http://cameron.com/admin它只是尝试加载AdminController并且不重定向你,如果我去:http://admin.cameron.com/我只是得到500内部服务器错误.

有关如何使CakePHP正常工作的任何想法?

aer*_*zov 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>
Run Code Online (Sandbox Code Playgroud)

  • 我也用之前评论的更易读的版本更新了答案 (2认同)