cakephp 在URL中隐藏控制器路径

nwo49xxi  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(140)

我有这些URL:

  • https://my.example.com/api/foo
  • https://my.example.com/api/bar
  • https://my.example.com/api/baz

为了对用户 * 简化 * 它,也为了 * 强调 * 不同的含义,我设置了这些子域,它们具有与https://my.example.com/相同的DocumentRoot

  • https://foo.example.com/
  • https://bar.example.com/
  • https://baz.example.com/

由于事实上我不能做的最后一步,这意味着网址仍然是这样的:

  • https://foo.example.com/api/foo
  • https://bar.example.com/api/bar
  • https://baz.example.com/api/baz

这并没有真正简化它,因为用户仍然需要将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

mwkjh3gx

mwkjh3gx1#

我真的看不出这有什么更简单的,如果有什么的话,我会发现它是不那么冗长,这是从来没有好的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没有覆盖所有子域,或者SEO中的内容重复,那么它们就无法正常工作。所以,请确保您的路径尽可能具体!
还请注意,资源路由将无法正常工作与此,因为它需要一个路径元素,即你不能连接资源只在/上,如foo.example.com,它将不得不foo.example.com/resource-name,如果你想连接到前者,每个资源路由将需要手动连接。
最后,如果没有使用命名路由,那么如果要生成URL,就必须在URL数组中使用'_host' => 'foo.example.com'
另请参阅

*操作手册〉路由〉匹配特定主机名

相关问题