在 URL 中隐藏控制器路径

Hiding the controller path in the URL

我有这些 URL:

为了为用户简化它并且强调不同的含义我设置了这些具有相同的子域DocumentRoot 作为 https://my.example.com/:

由于我无法完成最后一步,这意味着 URL 仍然是这样的:

这并没有真正简化它,因为用户仍然需要将 api/<name> 附加到 URL。

我的问题:

有没有办法在 CakePHP 控制器中省略 /api/<name> 以某种方式重定向它 这样输入 https://foo.example.com/ 就足够了,这将 运行 https://foo.example.com/api/foo?

中的代码

我可以使用 $_SERVER ["SERVERNAME"] 检查当前的子域,所以这不是问题所在。

是什么让它变得有点困难:

登录页面通常通过 https://foo.example.com/users/login 访问,这意味着当 /users/login 是 URL 的一部分时, 不可见重定向 不得触发。但是,我想我可以防止检查 $_SERVER 变量的内容。

真心希望你们明白我的意思。

PS:我不想使用 Apache 的重定向,因为这会在浏览器中显示最终的 URL https://foo.example.com/api/foo

运行 CakePHP 4.1.4

我真的不明白这怎么会更简单,如果有的话我会发现它不那么冗长,这对 URL 来说从来都不是一件好事。无论如何,听起来您正在寻找主机绑定路由,即 _host 选项。

这会将 / 连接到 foo.example.combar.example.combaz.example.com,每个连接到不同的控制器,具体取决于主机:

$routes->scope(
    '/',
    function (\Cake\Routing\RouteBuilder $builder) {
        $builder
            ->connect('/', ['controller' => 'Foo'])
            ->setHost('foo.example.com');

        $builder
            ->connect('/', ['controller' => 'Bar'])
            ->setHost('bar.example.com');

        $builder
            ->connect('/', ['controller' => 'Baz'])
            ->setHost('baz.example.com');

        $builder
            ->connect('/users/login', ['controller' => 'Users', 'action' => 'login']);
    }
);

/users/login URL 将连接到任何主机,因为它不受限制,即所有这些 URL 都可以工作并指向相同的控制器和操作:

  • foo.example.com/users/login
  • bar.example.com/users/login
  • baz.example.com/users/login

这可能会带来更多问题,例如,如果 cookie 未针对所有子域进行限定,则 cookie 无法正常工作,或者就 SEO 而言,内容重复。因此,请确保您的路线尽可能具体!

另请注意,资源路由无法正常工作,因为它需要一个路径元素,即您不能仅在 / 上连接资源,例如 foo.example.com,它必须是foo.example.com/resource-name,如果你想连接到前者,每个资源路由都需要手动连接。

最后,如果您不使用命名路由,那么如果您想生成 URLs,则必须在 URL 数组中使用 '_host' => 'foo.example.com'

另见