У меня Apache2 на Ubuntu обслуживает несколько хостов. У некоторых хостов есть части Website и API, а также некоторые папки, например uploads
который должен храниться вне корня документа. Я хотел бы организовать их в следующей файловой структуре:
domain
uploads
htdocs //document root
api
site
Вопросы следующие:
api
от корня документа до site
папка без изменения uri браузераsite
папка, т.е. вместо /site/..
шоу /..
в браузере uriЯ пробовал следующее, но это вызывает ERR_TOO_MANY_REDIRECTS
RewriteCond %{REQUEST_URI} !^/api/.*$
RewriteCond %{REQUEST_URI} !^/site.*
RewriteRule ^(.*)$ /site/$1 [L]
RewriteCond %{REQUEST_URI} ^/site/?(.*)
RewriteRule .* /%1 [R]
Вы получаете цикл перенаправления, потому что перезаписанный URL-адрес совпадает с URL-адресом, который вы хотите перенаправить. В .htaccess
механизм перезаписи запускается заново после первой перезаписи, несмотря на наличие L
флаг. В L
flag просто останавливает текущий проход, но не останавливает всю обработку.
- как я могу перенаправить все запросы кроме
api
от корня документа доsite
папка без изменения uri браузера- и перепишите uri браузера, чтобы документировать корневой каталог для запросов, сделанных непосредственно в папку сайта, т.е. вместо
/site/..
шоу/..
в браузере uri
У вас перевернута терминология. №1 - это фактически «переписывание», а не «перенаправление». Вы внутренне переписываете (перезаписываете URL-адрес) запрос - видимый URL-адрес не меняется. И №2 - это внешнее «перенаправление», а не «переписывание». Как и при внешнем редиректе 3xx - браузер перенаправляется.
Я бы также изменил порядок, поэтому сначала вы выполните №2 - внешнее перенаправление. Как правило, перенаправления всегда должны выполняться до перезаписи.
Вместо этого попробуйте следующее:
# Redirect direct requests for "/site/<anything>" to "/<anything>"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^site/(.*) /$1 [R=302,L]
# Rewrite "/<anything>" to "/site/<anything>"
# except for "/api" and "/site" itself.
RewriteRule !^(api|site)/ /site%{REQUEST_URI} [L]
В RewriteCond
директива о перенаправлении, которая проверяет соответствие REDIRECT_STATUS
переменная окружения предотвращает цикл перенаправления. Эта переменная пуста при первоначальном запросе и установлена в "200" (как в статусе 200 OK) после первой успешной перезаписи.
Второе правило (перезапись) использует отрицание шаблон исключить запросы к /api
и /site
каталоги. Это позволяет избежать необходимости в отдельном условии. Затем нам нужно использовать REQUEST_URI
серверная переменная вместо обратной ссылки в замена строка.