У меня есть редирект на месте. Если запрос поступает в корень, а контент доступен в /website3, он извлекает контент с веб-сайта3, но отображает только корневой запрос. Это работает очень хорошо. Например, если приходит запрос, например, example.com/foo/test/, и в /website3/foo/test есть файл index.htm, содержимое отображается без включения веб-сайта3 в URL-адрес. Это также хорошо работает, если существует другой путь, например, example.com/test, он перейдет в тестовый каталог. Это все идеально.
Я пытаюсь учесть, поступает ли запрос, например, example.com/website3/foo/test. Я бы хотел, чтобы это перенаправлялось на example.com/foo/test, но при этом загружалось содержимое с веб-сайта3. Я пробовал несколько вещей, и все они приводят к петле.
Вот текущий код:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
# Remove trailing slash on any URL that is requested directly (excludes rewritten URLs)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.*)/$ /$1 [R=301,L]
# Rewrite root
RewriteRule ^$ website3/ [L]
# If request maps to a directory in "/website3" then rewrite and append trailing slash
RewriteCond %{DOCUMENT_ROOT}/website3/$1 -d
RewriteRule ^([^.]+)$ website3/$1/ [L]
RewriteCond %{DOCUMENT_ROOT}/website3/$1 -f
RewriteRule (.*) website3/$1 [L]
Добавьте следующее сразу после директивы RewriteEngine
, чтобы удалить /website3/
из начала любого URL-адреса, который запрашивается напрямую.
# Remove "/website3/" from any URL requested directly
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^website3/(.*) /$1 [R=301,L]
Обратите внимание, что это проверяет REDIRECT_STATUS
env var, чтобы предотвратить цикл перенаправления — тот же принцип, что и ваше правило для удаления завершающей косой черты.
Переменная env REDIRECT_STATUS
не установлена (т. е. пуста) при первоначальном запросе и установлена на «200» (как в статусе 200 OK HTTP) после первой успешной перезаписи.
Сначала проверьте с 302 (временной) переадресацией, чтобы избежать потенциальных проблем с кэшированием.