У меня есть следующая структура каталогов, где /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/
Комментариев нет:
Отправить комментарий