Директива RewriteBase файла .htaccess

Директива

RewriteBase
Описание: Устанавливает базовый URL для преобразований в контексте каталога
Синтаксис: RewriteBase URL-path
Значение по умолчанию: Смотри использование для более подробной информации.
Контекст: directory.htaccess
Разрешение: FileInfo
Статус: Расширение
Модуль: mod_rewrite

Директива RewriteBase устанавливает базовый URL для преобразований в контексте каталога. Директива RewriteBase используется в конфигурационных файлах каталогов .htaccess. Это будет работать локально, т.е., префикс локального каталога отбрасывается на этом этапе обработки и ваши правила преобразований работают только в оставшейся части. В конце он автоматически добавляется обратно к пути.

Настройка по-умолчанию

RewriteBase

physical-directory-path

Когда, для какого-нибудь нового URL происходит подстановка(преобразование), этот модуль должен заново вовлечь этот URL в обработку. Для того чтобы иметь возможность сделать это, нужно знать какие у него префикс или база URL. По-умолчанию этот префикс равен самому пути. Однако на некоторых сайтах URL’ы не прямо соответствуют физическим путям, поэтому вы должны использовать директиву RewriteBase для указания правильного префикса URL.

Если URL вашего сервера не соответствуют физическим путям к файлам, вы должны использовать RewriteBase в каждом из .htaccess файлов, где вы хотите использовать директивы RewriteRule.

Например, предположим следующий конфигурационный файл каталога:

#
#  /abc/def/.htaccess -- конфигурационный файл каталога /abc/def
#  Помните: /abc/def это физический путь /xyz, т.е., у сервера есть
#            директива 'Alias /xyz /abc/def' к примеру

#

RewriteEngine On

#  даем серверу знать что мы работаем через /xyz а не
#  через префикс физического пути /abc/def
RewriteBase   /xyz

#  теперь правила преобразований
RewriteRule   ^oldstuff\.html$  newstuff.html

В примере выше, запрос к /xyz/oldstuff.html корректно преобразуется в физический файл /abc/def/newstuff.html.

Для любителей поковыряться в Apache

Следующий список дает подробную информацию об этапах внутренней работы:

Запрос:
  /xyz/oldstuff.html

Внутренняя работа:
  /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
  /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
  /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
  /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)

Результат:
  /abc/def/newstuff.html

Это может показаться очень сложным, однако это корректная внутренняя работа Apache. Из-за того что преобразования происходит целиком внутри сервера Apache, это происходить очень быстро и не требует дополнительных накладных расходов.

Как работает RewriteBase в .htaccess

Я видел это в нескольких примерах .(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]

Это реальное правило, которое я использовал, чтобы гарантировать, что URL-адреса имеют завершающую косую черту. Это преобразует

http://www.example.com/~new/page

to

http://www.example.com/~new/page/

Имея там RewriteBase, вы относите относительный путь к параметру RewriteBase.

Ответ 2

RewriteBase применяется только к target правила относительного переписывания.

  • Использование RewriteBase как это…

    RewriteBase /folder/
    RewriteRule a\.html b.html
    
  • по существу совпадает с…

    RewriteRule a\.html /folder/b.html
    
  • Но когда файл .htaccess находится внутри /folder/then, это также указывает на одну и ту же цель:

    RewriteRule a\.html b.html
    

Несмотря на то, что документы подразумевают использование RewriteBase, Apache обычно правильно определяет пути для Documentroot, если:

  • Вы используете директивы Alias

  • Вы используете правила перезаписи htaccess для выполнения перенаправления HTTP (а не просто молчания) для относительных URL

В этих случаях вы можете обнаружить, что вам нужно указать RewriteBase.

Однако, поскольку это запутанная директива, обычно лучше просто указывать абсолютные (ака «корневые относительные» ) URI в ваших переписывающих целях. Другие разработчики, читающие ваши правила, поймут их легче.


Цитата из Джон Лин отличный подробный ответ здесь:

В файле htaccess mod_rewrite работает аналогично контейнеру <Directory> или <Location>. и RewriteBase используется для предоставления относительной базы пути.

Например, скажем, что у вас есть эта структура папок:

DocumentRoot
   |-- subdir1
   |-- subdir2
       |-- subsubdir

Итак, вы можете получить доступ:

  • http://example.com/ (root)
  • http://example.com/subdir1 (subdir1)
  • http://example.com/subdir2 (subdir2)
  • http://example.com/subdir2/subsubdir (subsubdir)

URI, который отправляется через RewriteRule, относится к каталогу, содержащему файл htaccess.blah3$ blah3.php [L] …

И тогда, когда вам нужно было переместить эти файлы и правила в другой каталог, просто измените базу:

RewriteBase /subdir2/subsubdir/

и что он.

Ответ 3

AFAIK, RewriteBase используется только для исправления случаев, когда mod_rewrite работает в файле .htaccess не в корне сайта, и он угадывает неправильный веб-путь (в отличие от пути к файловой системе) для папки, в которой он запущен Итак, если у вас есть RewriteRule в .htaccess в папке, которая отображается в http://example.com/myfolder, вы можете использовать:

RewriteBase myfolder

Если mod_rewrite работает некорректно.

Попытка использовать его для достижения чего-то необычного, а не для исправления этой проблемы, звучит как рецепт для очень запутывания.

Ответ 4

RewriteBase полезен только в ситуациях, когда вы можете поместить .htaccess в корневой каталог вашего сайта. В противном случае вам может быть лучше разместить ваши разные файлы .htaccess в разных каталогах вашего сайта и полностью исключить директиву RewriteBase.

В последнее время для сложных сайтов я их вынимаю, потому что он позволяет развертывать файлы из тестирования, чтобы жить еще один шаг.

Ответ 5

Когда я разрабатываю, он находится в другом домене внутри папки. Когда я беру сайт в прямом эфире, эта папка больше не существует. Использование RewriteBase позволяет использовать тот же файл .htaccess в обеих средах.

Когда живут:

RewriteBase /
# RewriteBase /dev_folder/

При разработке:

# RewriteBase /
RewriteBase /dev_folder/
Ответ 6

Самое ясное объяснение, которое я нашел, не было в текущих 2.4 apache-документах, но в версии 2.0.

#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
#  Remember: /abc/def is the physical path of /xyz, i.e., the server
#            has a 'Alias /xyz /abc/def' directive e.g.

RewriteEngine On

#  let the server know that we were reached via /xyz and not
#  via the physical path prefix /abc/def
RewriteBase   /xyz

Как это работает? Для вас, хакеров Apache, этот 2.0 doc продолжает давать «подробную информацию о внутренних этапах обработки».

Извлеченный урок: хотя нам нужно быть знакомым с «текущим», драгоценности можно найти в анналах.

Ответ 7

Эта команда может явно указать базовый URL для ваших перезаписи. Если вы хотите начать с корня своего домена, вы должны включить следующую строку перед RewriteRule:

RewriteBase /
Ответ 8

Я считаю, что этот отрывок из документации Apache, хорошо дополняет предыдущие ответы:

Эта директива требуется, если вы используете относительный путь в подстановки в контексте per-directory (htaccess), если ни один из выполняются следующие условия:

  • Исходный запрос и подстановка находятся под DocumentRoot (в отличие от достижимых другими способами, такими как псевдоним).

  • Путь файловой системы к каталогу, содержащему RewriteRule, дополненному относительной заменой, также действителен как путь URL-адреса на сервер (это редко).

Как упоминалось ранее, в других контекстах полезно ваше правило короче. Кроме того, как уже упоминалось выше, вы можете выполните одно и то же, поместив файл htaccess в подкаталог.

Почему RewriteBase не работает? — apache-2.2

Здесь есть пара вещей. Во-первых, Alias Директива хочет, чтобы ее правая сторона была абсолютным, физическим путем на сервере: вы хотите

Alias /runs /mysite/xhprof/xhprof_html

<Directory /mysite/xhprof/xhprof_html>
    Order allow,deny
    Allow from all
    AllowOverride All
</Directory>

Во-вторых, RewriteRule RewriteRule .* index.php совпадает не только http://.../runs, но также любой URL, начинающийся с http://.../runs/даже, например, http://.(.*)$ index.php/$1 [QSA]

который сохраняет как информацию о пути ($1 часть) и строка запроса («QSA» = «добавление строки запроса».)

Я написал слишком много еще?:)

Как работает RewriteBase в .htaccess

RewriteBase применяется только к мишени о наличии относительного правила перезаписи.

  • Используя RewriteBase вот так …

    RewriteBase /folder/
    RewriteRule a\.html b.html
    
  • по сути то же самое, что …

    RewriteRule a\.html /folder/b.html
    
  • Но когда файл .htaccess находится внутри, /folder/это также указывает на ту же цель:

    RewriteRule a\.html b.html
    

Хотя в документации подразумевается всегда использование a RewriteBase, Apache обычно правильно определяет его для путей в DocumentRoot, если:

  • Вы используете Aliasдирективы

  • Вы используете правила перезаписи .htaccess для выполнения HTTP-перенаправления (а не просто тихой перезаписи) на относительные URL-адреса.

В этих случаях вы можете обнаружить, что вам нужно указать RewriteBase.

Однако, поскольку это запутанная директива, обычно лучше просто указывать абсолютные (также известные как «относительные корневые») URI в ваших целях перезаписи. Другие разработчики, читающие ваши правила, поймут их легче.


Цитата из отличного подробного ответа Джона Линя здесь :

В файле htaccess mod_rewrite работает так же, как <Directory> или <Location> контейнер. и RewriteBaseиспользуется для предоставления базы относительного пути.

Например, предположим, что у вас есть такая структура папок:

DocumentRoot
|-- subdir1
`-- subdir2
    `-- subsubdir

Таким образом, вы можете получить доступ:

  • http://example.com/ (корень)
  • http://example.blah3$ blah3.php [L] ...

    А затем, когда вам нужно переместить эти файлы и правила в другой каталог, просто измените базу:

    RewriteBase /subdir2/subsubdir/
    

    вот и все.

    Как работает RewriteBase в файле. htaccess

    RewriteBase применяется только к целевому объекту относительного правила перезаписи.

    • Используя RewriteBase вот так…

      RewriteBase /folder/
      RewriteRule a\.html b.html
      
    • по сути, это то же самое, что и…

      RewriteRule a\.html /folder/b.html
      
    • Но когда файл .htaccess находится внутри /folder/ , это также указывает на ту же цель:

      RewriteRule a\.html b.html
      

    Хотя в документах подразумевается , что всегда используется RewriteBase, Apache обычно правильно определяет его для путей под DocumentRoot, если только:

    • Вы используете директивы Alias

    • Вы используете правила перезаписи .htaccess для выполнения перенаправлений HTTP (а не просто беззвучной перезаписи) на относительное URLs

    В этих случаях вам может потребоваться указать RewriteBase.

    Однако, поскольку это запутанная директива, обычно лучше просто указать absolute (aka ‘root relative’) URIs в ваших целях перезаписи. Другие разработчики, читающие ваши правила, поймут их легче.


    Цитирую отличный подробный ответ Джона Лина здесь :

    В файле htaccess mod_rewrite работает аналогично контейнеру <Directory> или <Location> . и RewriteBase используется для обеспечения относительной базы пути.

    Например, предположим, что у вас есть такая структура папок:

    DocumentRoot
    |-- subdir1
    `-- subdir2
        `-- subsubdir
    

    Таким образом, вы можете получить доступ:

    • http://example.com/ (корень)
    • http://example.blah3$ blah3.php [L] ...

      А затем, когда вам нужно будет переместить эти файлы и правила в другой каталог, просто измените базу:

      RewriteBase /subdir2/subsubdir/
      

      и это все.

      Как RewriteBase работает в .htaccess

      RewriteBaseприменяется только к мишени о наличии относительного правила перезаписи.

      • Используя RewriteBase, как это …

        RewriteBase /folder/
        RewriteRule a\.html b.html
        
      • по сути то же самое, что и …

        RewriteRule a\.html /folder/b.html
        
      • Но когда файл .htaccess находится внутри, /folder/это также указывает на ту же цель:

        RewriteRule a\.html b.html
        

      Хотя документы подразумевают всегда использование a RewriteBase, Apache обычно правильно определяет его для путей в DocumentRoot, если только:

      • Вы используете Aliasдирективы

      • Вы используете правила перезаписи .htaccess для выполнения перенаправления HTTP (а не просто перезаписи без вывода сообщений) на относительные URL

      В этих случаях вы можете обнаружить, что вам нужно указать RewriteBase.

      Тем не менее, поскольку это непонятная директива, обычно лучше просто указывать абсолютные (иначе называемые «коренные родственники») URI в целях перезаписи. Другие разработчики, читающие ваши правила, поймут это легче.


      Цитата из превосходного подробного ответа Джона Линя здесь :

      В файле htaccess mod_rewrite работает аналогично контейнеру <Directory>или <Location>. и RewriteBaseиспользуется для обеспечения базы относительного пути.

      Например, скажем, у вас есть эта структура папок:

      DocumentRoot
      |-- subdir1
      `-- subdir2
          `-- subsubdir
      

      Таким образом, вы можете получить доступ к:

      • http://example.com/ (Корень)
      • http://example.blah3$ blah3.php [L] ...

        И затем, когда вам нужно было переместить эти файлы и правила в другой каталог, просто измените базу:

        RewriteBase /subdir2/subsubdir/
        

        и это все.

        Что RewriteBase делать и как его использовать?

        В файле htaccess, mod_rewrite, с работы, похожие на в <каталог> " или " <расположение> контейнер. и RewriteBase используется для обеспечения относительного базового пути.

        Например, скажем, у вас есть такая структура папок:

        Так что вы можете получить доступ к:

        • http://example.com/ (корень)
        • http://example.com/subdir1 (каталог subdir1)
        • http://example.com/subdir2 (каталог subdir2)
        • http://example.com/subdir2/subsubdir (subsubdir)

        URI, который передается через RewriteRule-это относительно каталога. Так что если у вас есть:

        в корень, и запрос /А/B/С/D, затем захватили Ури ($1) — это А/B/С/D. Но если правило в каталог subdir2запрос/каталог subdir2/Е/F/гзатем захватили УриЕ/F/г. И если правило в subsubdir, запрос /каталог subdir2/subsubdir/Х/Y/Z, то захваченные Ури х/у/Z. Каталог, правила в этой части снял Ури. Базы переписывать не влияет на это, это просто как ТВ-каталог работ.

        Что переписать базы делает делать, — это предоставить url-путь базы (не файл-путь базы) для любых относительных путей в правиле’С цель. Так говорите у вас это правило:

        В `bar.php-это относительный путь, в отличии от:

        где /bar.php абсолютный путь. Абсолютный путь будет всегда быть в «корень» (в структуре каталогов выше). Это означает, что если правило в «корень и», и»Каталог subdir1″ и «Ну subsubdir» Ну и т. д. В путь/bar.php всегда картыhttp://example.com/bar.php`.

        Но другое правило, с относительный путь, он’s на основе каталога, что правило. Так что если

        это в «корень» и вы идете http://example.com/foo, вы обслуживаетесь http://example.com/bar.php. Но если это правило в «Каталог subdir1» в каталог, и вы идете http://example.com/subdir1/foo, вы обслуживаетесь http://example.com/subdir1/bar.php. и т. д. Это иногда работает, а иногда не’т, как сказано в документации, он’ы должны быть требуется для относительных путей, но большую часть времени это, кажется, работает. За исключением, когда вы перенаправляете (через » Р » флаг, или неявно, потому что у вас есть http://host в правила’с). Это означает, что это правило:

        если это’ы в «Каталог subdir2» в каталог, и вы идете http://example.com/subdir2/foo, модуля mod_rewrite будет ошибкой относительный путь как путь к файлу-путь, а не url-пути и из-за » Р » флаг, вы’ll итоге перенаправляют что-то вроде: http://example.com/var/www/localhost/htdocs/subdir1. Что, очевидно, не то, что вы хотите.

        Это где RewriteBase приходит. Директивы модуля mod_rewrite говорит, что нужно дописать в начале каждой относительный путь. Так что, если у меня:

        и это правило в «subsubdir» и, подойдя к http://example.com/subdir2/subsubdir/foo на самом деле будет служить мне http://example.com/blah/bar.php`. В «Бар.РНР» и добавляется в конец базы. На практике это обычно не то, что вы хотите, потому что вы можете’т иметь несколько баз в одном контейнере каталог или файл htaccess.

        В большинстве случаев, это’s используемый как этот:

        где эти правила будут в «Каталог subdir1 и» каталог и

        будет в «Каталог subsubdir и».

        Это частично позволяет сделать портативный ваши правила, так что вы можете положить их в любую директорию и нужно только менять основание, а не кучу правил. Например, если у вас:

        такой, что будет http://example.com/subdir1/foo служить http://example.com/subdir1/bar.php и т. д. И сказать, что вы решили перенести все эти файлы и правила в "Каталог subsubdir и". Вместо того, чтобы изменить каждый экземпляр/каталог subdir1/ » к » /каталог subdir2/subsubdir/`, вы могли бы просто имели основание:

        А затем, когда вам нужно переместить эти файлы и правила в другой каталог, только менять основание:

        и что’s оно.

        mod rewrite — Как работает RewriteBase в .htaccess

        RewriteBase применяется только к целевому правила перезаписи относительного .

        • Использование RewriteBase следующим образом…

            RewriteBase /папка/
          Правило перезаписи a\.html b.html
            
        • по сути то же самое, что и…

            Правило перезаписи a\.html /folder/b.html
            
        • Но когда файл .htaccess находится внутри /folder/ , тогда это также указывает на ту же цель:

            Правило перезаписи a\.html b.html
            

        Хотя документы всегда подразумевают использование RewriteBase , Apache обычно правильно определяет пути в DocumentRoot, если:

        • Вы используете Псевдоним директивы

        • Вы используете правила перезаписи .htaccess для выполнения HTTP-перенаправлений (вместо простой перезаписи без вывода сообщений) на относительных URL-адресов

        В этих случаях может оказаться необходимым указать RewriteBase.

        Однако, поскольку эта директива сбивает с толку, обычно лучше просто указывать абсолютные (также известные как «корневые относительные») URI в ваших целях перезаписи. Другие разработчики, читающие ваши правила, поймут их легче.


        Цитата из превосходного подробного ответа Джона Лина здесь:

        В файле htaccess mod_rewrite работает аналогично контейнеру или . и RewriteBase используется для предоставления базы относительного пути.

        Например, скажем, у вас есть такая структура папок:

          Корневой документ
        |-- подкаталог1
        `-- подкаталог2
            `-- подкаталог
          

        Итак, вы можете получить доступ:

        • http://example.com/ (корень)
        • http://example.com/subdir1 (subdir1)
        • http://example.com/subdir2 (subdir2)
        • http://example.com/subdir2/subsubdir (подподкаталог)

        URI, отправляемый через RewriteRule , относится к каталогу, содержащему файл htaccess.(.*)$ —

        • В корневом htaccess запрос /a/b/c/d , тогда захваченный URI ( $1 ) будет a/b/c/d .
        • Если правило находится в subdir2 и запрос /subdir2/e/f/g , тогда захваченный URI будет e/f/g .
        • Если правило находится в подкаталоге , а запрос — /subdir2/subsubdir/x/y/z , то полученный URI — x/y/z .

        У каталога, в котором находится правило, эта часть удалена из URI.foo$ /bar.php [L]

        , где /bar.php — это абсолютный путь. Абсолютный путь будет , всегда будет «корнем» (в приведенной выше структуре каталогов). Это означает, что независимо от того, находится ли правило в «root», «subdir1», «subsubdir» и т. д., путь /bar.php всегда отображается на http://example.com/bar.php .

        Но другое правило с относительным путем основано на каталоге, в котором находится правило.foo$ bar.php [Л]

        находится в «корне», и вы переходите на http://example.com/foo , вы получаете http://example.com/bar.php . Но если это правило находится в каталоге «subdir1», и вы переходите по адресу http://example.com/subdir1/foo , вы получаете http://example.com/subdir1/bar.php . и т. д. Иногда это работает, а иногда нет, как говорится в документации, для относительных путей должно быть , требуется , но в большинстве случаев это работает.foo$ bar.php [Л,П]

        , если он находится в каталоге «subdir2», и вы перейдете к http://example.com/subdir2/foo , mod_rewrite ошибочно примет относительный путь как путь к файлу вместо URL-пути и из-за R , вы в конечном итоге будете перенаправлены на что-то вроде: http://example.com/var/www/localhost/htdocs/subdir1 . Что явно не то, что вы хотите.

        Здесь на помощь приходит RewriteBase . Директива указывает mod_rewrite, что добавлять в начало каждого относительного пути.blah3$ blah3.php [L] …

        А затем, когда вам нужно было переместить эти файлы и правила в другой каталог, просто измените базу:

          RewriteBase /subdir2/subsubdir/
          

        и все.

        apache — Что делает RewriteBase и как его использовать?

        В файле htaccess mod_rewrite работает аналогично контейнеру или . и RewriteBase используется для предоставления базы относительного пути.

        Например, скажем, у вас есть такая структура папок:

          корень
         |-- подкаталог1
         |-- подкаталог2
               |-- подкаталог
          

        Итак, вы можете получить доступ:

        • http://example.com/ (корень)
        • http://example.com/subdir1 (subdir1)
        • http://example.com/subdir2 (subdir2)
        • http://example.com/subdir2/subsubdir (подподкаталог)

        URI, отправляемый через RewriteRule , относится к каталогу.(.*)$ —

        в корне и запрос /a/b/c/d , тогда захваченный URI ( $1 ) будет a/b/c/d . Но если правило находится в subdir2 , а запрос — /subdir2/e/f/g , то захваченный URI — e/f/g . И если правило находится в подкаталоге , а запрос — /subdir2/subsubdir/x/y/z , то захваченный URI — x/y/z . У каталога, в котором находится правило, эта часть удалена из URI.foo$ bar.php [L]

        находится в «корне», и вы переходите на http://example.com/foo , вы получаете http://example.com/bar.php . Но если это правило находится в каталоге «subdir1», и вы переходите по адресу http://example.com/subdir1/foo , вы получаете http://example.com/subdir1/bar.php . и т. д. Иногда это работает, а иногда нет, как говорится в документации, для относительных путей должно быть , требуется , но в большинстве случаев это работает.foo$ bar.php [Л,П]

        , если он находится в каталоге «subdir2», и вы перейдете к http://example.com/subdir2/foo , mod_rewrite ошибочно примет относительный путь как путь к файлу вместо URL-пути и из-за R , вы в конечном итоге будете перенаправлены на что-то вроде: http://example.com/var/www/localhost/htdocs/subdir1 . Что явно не то, что вы хотите.

        Здесь на помощь приходит RewriteBase . Директива указывает mod_rewrite, что добавлять в начало каждого относительного пути.foo$ bar.php [L]

        , и это правило находится в «subsubdir», перейдя по адресу http://example.com/subdir2/subsubdir/foo , я фактически обслужу http://example.com/blah/bar.php . «bar.php» добавляется в конец базы. На практике этот пример обычно не то, что вам нужно, потому что вы не можете иметь несколько баз в одном контейнере каталогов или файле htaccess.foo$ bar.blah3$ blah3.php [L] …

        А затем, когда вам нужно было переместить эти файлы и правила в другой каталог, просто измените базу:

          RewriteBase /subdir2/subsubdir/
          

        и все.

        .htaccess — перенос RewriteBase из htaccess в конфиг сайта не работает

        Значение директивы RewriteBase , определенной в родительских конфигурациях, не равно унаследовано дочерними конфигурациями по умолчанию *1 .Вам необходимо явно включить это с помощью параметра MergeBase в родительской конфигурации.

        Например:

          <Каталог /var/www/backend_dev/>
          Параметры
          RewriteEngine включен
          RewriteBase /backenddev/
          MergeBase
          Разрешить переопределить все
          ...
        
          

        Обратите внимание, что дочерние конфигурации могут переопределить это, установив собственный RewriteBase .

        *1 Это поведение по умолчанию фактически изменилось в Apache 2.4.4. Между 2.4.0 и 2.4.3 значение RewriteBase , по-видимому, по умолчанию было объединено с дочерними конфигурациями.

        Артикул:

        MergeBase
        С помощью этой опции значение RewriteBase копируется из того места, где оно явно определено, в любой подкаталог или подместо, которое не определяет свою собственную RewriteBase. Это было поведение по умолчанию в версиях с 2.4.0 по 2.4.3, и флаг для его восстановления доступен в Apache HTTP Server 2.4.4 и более поздних версиях.

        Обратите внимание, однако, что эта опция сама по себе не включает mod_rewrite наследование .share/([a-np-z1-9]{8})$ share.php?token=$1 [NC]

        Так как только o , o и 0 опущены из диапазона символов .

        Затем потребуется флаг NC для соответствия соответствующим прописным буквам.

        Также рассмотрите возможность добавления флага L , так как у вас есть «другие правила» — и они, скорее всего, будут обработаны без необходимости (при условии, что конфликта уже нет).

        Как работает RewriteBase с примером

        RewriteBase — это полезная серверная директива, доступная для веб-сервера Apache, которая позволяет вам легко обновлять многочисленные правила перезаписи за один раз.В этой статье мы рассмотрим, что такое RewriteBase и как он работает, на примерах.

        Что такое RewriteBase

        Директива RewriteBase позволяет легко установить начало всех относительных путей, используемых в файле .htaccess. Его значение используется в целевом/целевом пути, указанном в правилах перезаписи в файле .htaccess. Также это применимо только для правил перезаписи, упомянутых в том же файле .htaccess, где упоминается директива RewriteBase. Это полезно, если в вашем файле .htaccess-файл. Например, если вы хотите переместить все эти URL-адреса в новый каталог, просто измените значение RewriteBase, не изменяя никаких последующих правил перезаписи.

        Также читайте : Как изменить уровень журнала Apache

        Как работает RewriteBase с примером

        По умолчанию все относительные пути, используемые в файле .htaccess, относятся к расположению файла .htaccess. Например, если ваш файл .htaccess находится в папке /folder, то все относительные пути в файле .htaccess будут начинаться с /folder.Если у вас есть следующее RewriteRule,

         RewriteRule /sub-dir1 /sub-dir2 

        , тогда Apache будет перенаправлять все запросы из /folder/sub-dir1 в /folder/sub-dir2

        RewriteRule позволяет изменить это. Вот синтаксис директивы RewriteBase

        .
         RewriteBase/относительный/путь 

        В приведенном выше заявлении необходимо указать относительный путь для RewriteBase. Этот путь добавляется в начале каждого относительного пути назначения, используемого в RewriteRule.

        Давайте рассмотрим пример. Допустим, у вас есть следующее правило RewriteBase.

         RewriteBase /данные/ 

        Если у вас есть следующее RewriteRule после приведенного выше оператора.

         RewriteRule /продукт /о 

        Этот оператор перенаправит все запросы с /product на /data /about

        .

        Если файл .htaccess, содержащий это правило, находится в /folder, то Apache будет перенаправлять все запросы с /folder /product на / data /about

        Вот образец.htaccess с правилом RewriteBase и RewriteRule.

          Перезапись двигателя на 
          RewriteBase /данные/ 
        
        RewriteRule /product /about 

        Перед использованием директивы RewriteBase убедитесь, что вы включили mod_rewrite на сервере Apache. В противном случае вот шаги, чтобы сделать это.

        Также читайте : Как предотвратить SQL-инъекцию в Apache/PHP

        Включить mod_rewrite

        Откройте терминал и выполните следующие команды, чтобы включить mod_rewrite, в зависимости от вашей системы Linux.

        Ubuntu/Debian

        Откройте терминал и выполните следующую команду, чтобы включить mod_rewrite

         $ sudo a2enmod переписать 

        RedHat/CentOS/Fedora

        Откройте файл конфигурации Apache в текстовом редакторе.

         $ судо-ви /etc/apache2/httpd.conf 

        Найдите следующую строку.

         #LoadModule модули rewrite_module/mod_rewrite.so 

        Раскомментируйте его, удалив # в начале.Если вы не найдете эту строку, добавьте ее заново.

        Также найдите следующий тег Directory и измените AllowOverride с None на All.

         . . . 
        <Каталог /var/www/html>
        . . .
        #
        # AllowOverride контролирует, какие директивы могут быть помещены в файлы .htaccess.
        # Это может быть "Все", "Нет" или любая комбинация ключевых слов:
        # Опции FileInfo AuthConfig Limit
        #
        AllowOverride All
        . . .

        .. .

        Также читайте : Рекомендации по разрешению файлов Apache


        В этой статье мы узнали, что такое RewriteBase и как им пользоваться. Это в основном помогает вам установить начало всех целевых относительных путей для правил перезаписи, упомянутых в вашем файле .htaccess. Он работает только с путями назначения ваших правил перезаписи.

        Файл .htaccess с установкой RewriteBase · GitHub

        . . .
        #
        # Настройки Apache/PHP/Drupal:
        #
        # Защитите файлы и каталоги от посторонних глаз.(\..*|Записи.*|Репозиторий|Корень|Тег|Шаблон)$»>
        Приказ разрешить, запретить
        # Не показывать списки каталогов для URL-адресов, которые сопоставляются с каталогом.
        Опции — Индексы
        # Переходите по символическим ссылкам в этом каталоге.
        Параметры +FollowSymLinks
        # Заставить Drupal обрабатывать любые ошибки 404.
        ErrorDocument 404 /index.php
        # Установить обработчик по умолчанию.
        Индекс DirectoryIndex.php index.html index.htm
        # Переопределить настройки PHP, которые нельзя изменить во время выполнения. См.
        # sites/default/default.settings.php и drupal_initialize_variables() в
        # include/bootstrap.inc для настроек, которые можно изменить во время выполнения.
        # PHP 5, Apache 1 и 2.
        php_flag magic_quotes_gpc выключен
        php_flag magic_quotes_sybase выключен
        php_flag register_globals выключен
        php_flag session.auto_start выключен
        php_value mbstring.http_input проход
        php_value mbstring.http_output проход
        php_flag mbstring.encoding_translation выключен
        # Требуется, чтобы mod_expires был включен.
        # Включить истечение срока действия.
        ExpiresActive On
        # Кэшировать все файлы на 2 недели после доступа (A).
        ExpiresDefault A1209600
        <Соответствие файлов \.PHP$>
        # Не разрешать кеширование PHP-скриптов, если они явно не отправляют кеш
        # сами заголовки. В противном случае все скрипты должны были бы перезаписывать
        # заголовки, установленные mod_expires, если они хотят другого поведения кэширования. Это май
        # сбой, если ошибка возникает в начале процесса начальной загрузки, и это может вызвать
        # проблемы, если в подкаталоге установлен PHP-файл, отличный от Drupal.
        ExpiresActive Выкл.
        # Различные правила перезаписи.
        Переписать двигатель на
        # Запретить доступ к «скрытым» каталогам, имена которых начинаются с точки.Это
        # включает каталоги, используемые системами контроля версий, такими как Subversion или
        # Git для хранения управляющих файлов. Файлы, имена которых начинаются с точки, а также
        # поскольку управляющие файлы, используемые CVS, защищены директивой FilesMatch
        # выше.
        #
        # ПРИМЕЧАНИЕ. Это работает только при загрузке mod_rewrite.Без mod_rewrite это
        # невозможно заблокировать доступ ко всем каталогам из .htaccess, потому что
        # здесь не допускается.
        #
        # Если у вас не установлен mod_rewrite, вы должны удалить эти
        # каталоги из вашего веб-каталога или иным образом защитите их от
        # скачал.|/)\.» — [Ф]
        # Если к вашему сайту можно получить доступ как с ‘www.’, так и без него. префикс, вы
        # можно использовать один из следующих параметров для перенаправления пользователей на предпочтительный
        # URL, С или БЕЗ ‘www.www\.http://%1%{REQUEST_URI} [L,R=301]
        # Измените RewriteBase, если вы используете Drupal в подкаталоге или в
        # VirtualDocumentRoot и правила перезаписи не работают должным образом.
        # Например, если ваш сайт находится по адресу http://example.com/drupal, раскомментируйте и
        # изменить следующую строку:
        # Переписать базу/друпал
        #
        # Если ваш сайт работает в VirtualDocumentRoot по адресу http://example.ком/,
        # раскомментировать следующую строку:
        # RewriteBase /
        RewriteBase /dev.localhost.com
        # Передать все запросы, не относящиеся непосредственно к файлам в файловой системе, на
        # индекс.index.php [L]
        # Правила для правильного обслуживания сжатых gzip файлов CSS и JS.
        # Требуется включить как mod_rewrite, так и mod_headers.
        # Подавать файлы CSS, сжатые gzip, если они существуют и клиент принимает gzip.(.*)\.js $1\.js\.gz [QSA]
        # Подавать правильные типы контента и предотвращать двойное сжатие mod_deflate.
        RewriteRule \.css\.gz$ — [T=text/css,E=no-gzip:1]
        RewriteRule \.js\.gz$ — [T=text/javascript,E=no-gzip:1]
        <Соответствие файлов "(\.js\.gz|\.css\.gz)$">
        # Подавать правильный тип кодировки.
        Набор заголовков Content-Encoding gzip
        # Заставить прокси-серверы отдельно кэшировать сжатые и не сжатые файлы css/js.
        Добавление заголовка Vary Accept-Encoding

        Объяснение Htaccess RewriteBase — Конфигурация сервера — Форумы SitePoint

        Хайем

Добавить комментарий

Ваш адрес email не будет опубликован.