Скрытие пути к контроллеру в URL

#cakephp #subdomain #url-routing #cakephp-4.x

#cakephp #поддомен #url-маршрутизация #cakephp-4.x

Вопрос:

У меня есть эти URL-адреса:

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

Чтобы упростить его для пользователя, а также подчеркнуть другое значение, я настроил эти поддомены, которые имеют то же DocumentRoot самое, что https://my.example.com/ :

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

Из-за того, что я не могу выполнить последний шаг, что означает, что URL-адреса по-прежнему такие:

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

что на самом деле не упрощает его, поскольку пользователю все еще нужно добавить api/<name> к URL.

Мой вопрос:

Есть ли способ как-то опустить /api/<name> и перенаправить его в контроллере CakePHP, чтобы было достаточно ввести https://foo.example.com/ , и это запустило бы код https://foo.example.com/api/foo ?

Я могу проверить текущий поддомен, используя $_SERVER ["SERVERNAME"] so, так что это не проблема.

Что делает это немного сложнее:

Страница входа в систему, как обычно, доступна через https://foo.example.com/users/login , что означает, что когда /users/login является частью URL-адреса, невидимое перенаправление НЕ должно запускаться. Тем не менее, я думаю, что могу предотвратить эту проверку содержимого $_SERVER переменной.

Я действительно надеюсь, что вы, ребята, понимаете, что я имею в виду.

PS: Я не хочу использовать перенаправление Apache, поскольку это отобразит конечный URL https://foo.example.com/api/foo -адрес в браузере.

Запуск CakePHP 4.1.4

Ответ №1:

Я действительно не понимаю, как это проще, во всяком случае, я бы счел это менее подробным, что никогда не подходит для URL. В любом случае, похоже, что вы ищете маршруты, привязанные к хосту, то _host есть опцию.

Это будет подключаться / к foo.example.com , bar.example.com , и baz.example.com , каждый к другому контроллеру в зависимости от хоста:

 $routes->scope(
    '/',
    function (CakeRoutingRouteBuilder $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. Поэтому убедитесь, что ваши маршруты максимально конкретны!

Также обратите внимание, что маршрутизация ресурсов не будет работать должным образом с этим, поскольку для этого требуется элемент path, т. Е. Вы не можете подключать ресурсы только / , например foo.example.com , это должно быть foo.example.com/resource-name , если бы вы хотели подключиться к первому, каждый маршрут ресурса нужно было бы подключать вручную.

Наконец, если вы не используете именованные маршруты, вам придется использовать '_host' => 'foo.example.com' в своих массивах URL-адресов, если вы хотите генерировать URL-адреса!

Смотрите также

Комментарии:

1. Я не могу еще раз достаточно отблагодарить вас. Это именно то, что я искал. Мне пришлось добавить action к этой connect опции, но она работает отлично. @simple: я не объяснил все мысли. @SEO: Это не проблема, поскольку мы говорим здесь о закрытой зоне. Поисковым системам будет даже запрещено сканировать его. Я сейчас много тестировал, и, кажется, это работает.