Назад | Перейти на главную страницу

Как перенаправить из корня документа в папку с apache2 mod_rewrite

У меня Apache2 на Ubuntu обслуживает несколько хостов. У некоторых хостов есть части Website и API, а также некоторые папки, например uploads который должен храниться вне корня документа. Я хотел бы организовать их в следующей файловой структуре:

domain
    uploads
    htdocs  //document root
        api
        site

Вопросы следующие:

  1. как я могу перенаправить все запросы кроме api от корня документа до site папка без изменения uri браузера
  2. и перепишите uri браузера, чтобы документировать root для запросов, сделанных непосредственно к 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 просто останавливает текущий проход, но не останавливает всю обработку.

  1. как я могу перенаправить все запросы кроме api от корня документа до site папка без изменения uri браузера
  2. и перепишите 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 серверная переменная вместо обратной ссылки в замена строка.