GOOGLE ADS

четверг, 28 апреля 2022 г.

Перенаправление на внешний интерфейс в каталоге или API в другом каталоге с использованием .htaccess

У меня есть следующая структура каталогов, где /rootдействует как мой корневой каталог, несмотря на то, что он вложен среди любого количества подкаталогов:


  • example.com/dir1/root

    • клиент/сборка

    • Пожар




Когда пользователь переходит к example.com/dir1/root/, я хотел бы, чтобы все запросы были перенаправлены, example.com/dir1/root/client/build/но без изменения URL-адреса, как если бы build/содержимое каталога было внутри root/.

Кроме того, я бы хотел, чтобы все запросы example.com/dir1/root/api/*перенаправлялись на example.com/dir1/root/api/. Опять же, без изменения URL.

Это моя текущая попытка, учитывая мое небольшое понимание того, как работает.htaccess:

RewriteEngine on
# If an existing asset or directory is requested go to it as it is.
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# Redirect all requests under /api/ to the API.
RewriteCond %{REQUEST_URI} ^/api/
RewriteRule ^ api/index.php [L]
# If the requested resource doesn't exist, use index.html (html5mode)
RewriteRule ^ client/build/index.html [L]

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


Решение проблемы

Вместо /dir1/root/.htaccessэтого попробуйте так:

RewriteEngine on
# Optimisation: Prevent further processing if "index.php" or "index.html" requested
RewriteRule /index\.(php|html)$ - [L]
# Redirect all requests under /api/ to the API.
RewriteRule ^api/ api/index.php [L]
# If the requested resource doesn't exist, use index.html (html5mode)
RewriteCond %{REQUEST_FILENAME}!-f
RewriteRule ^ client/build/index.html [L]

Это предполагает, что вам не нужен прямой доступ к подкаталогам, так как они будут внутренне перезаписаны client/build/index.html- это позволяет перезаписать сам «корневой» каталог, в противном случае вам понадобится другое правило для обработки запросов для «корня». сам.

# If an existing asset or directory is requested go to it as it is.
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# Redirect all requests under /api/ to the API.
RewriteCond %{REQUEST_URI} ^/api/
RewriteRule ^ api/index.php [L]
# If the requested resource doesn't exist, use index.html (html5mode)
RewriteRule ^ client/build/index.html [L]

Проблемы с существующими правилами:


  • Поскольку первое правило предотвращает обработку любых запросов, которые сопоставляются с файлами или каталогами, оно также предотвращает /dir1/root/перезапись запросов для самого себя (то есть каталога) в /dir1/root/client/build/index.html.


  • Условие никогда не будет выполнено, поскольку переменная сервера содержит URL-путь относительно корня, т.е..RewriteCond %{REQUEST_URI} ^/api/REQUEST_URI/dir1/root/api/


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

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...