#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: Это не проблема, поскольку мы говорим здесь о закрытой зоне. Поисковым системам будет даже запрещено сканировать его. Я сейчас много тестировал, и, кажется, это работает.