How to add .htaccess code to apache2.conf?

I want to add my .htaccess code into /etc/apache2/apache2.conf.

I want to combine these:

.htaccess file.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]
</IfModule>

/etc/apahce2/apache2.conf file.

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>



Problem is I don't know where to add htaccess code. How can I combine these files?
I am using Ubuntu 18.04.
Thanks in advance!

1
задан 9 July 2020 в 08:50

1 ответ

Предполагая, что ваш файл .htaccess в настоящее время находится в /var/www/.htaccess , тогда вы можете буквально просто объединить их. Контейнеры .htaccess и используют один и тот же каталог directory «context» - они следуют одинаковому (похожему) синтаксису.

Другими словами:

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^([^\.]+)$ $1.php [NC,L]
    </IfModule>
</Directory>

​​Однако, если вы собираетесь использовать директивы mod_rewrite в контейнере , вам следует рассмотреть возможность отключения .htaccess в целом (т.е. AllowOverride None ) , поскольку .htaccess переопределит контейнер (по умолчанию), а ваши директивы будут игнорироваться.

Нет необходимости в Обертка здесь, так как похоже, что эти директивы являются обязательными.

Пара незначительных точек ...

  • Нет необходимости экранировать обратную косую черту, когда используется внутри класса символов регулярных выражений, так как он не несет особое значение здесь. то есть. [^ \.] совпадает с [^.] .

  • Флаг NC в вашей директиве RewriteRule является излишним поскольку ваш шаблон уже совпадает как с заглавными, так и с заглавными буквами.

  • Вы явно включаете индексы каталогов ( Опции индексов ), но ваши директивы mod_rewrite эффективно предотвращают доступ к каталогам в любом случае. Вероятно, вам следует отключить индексы каталогов.

Объединяя эти точки, мы получаем:

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted

    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^.]+)$ $1.php [L]
</Directory>

Альтернативный подход и, возможно, то, что @ponsfrilus предлагал в комментариях, заключается в добавлении директив mod_rewrite непосредственно в конфигурацию сервера (контекст server ) или контейнера (контекст virtualhost ) - вне контейнер. (Обратите внимание, что если вы уже используете контейнеры - предпочтительно - тогда вам, вероятно, понадобится , чтобы добавить эти директивы в соответствующий контейнер . В противном случае директивы в контексте server , вероятно, просто будут переопределены.)

Преимущество этого подхода заключается в том, что они не могут быть переопределены с помощью .htaccess . Но если вы отключаете . В любом случае, htaccess (которым вы, вероятно, должны быть - поскольку вы перемещаете эти директивы в конфигурацию вашего сервера), тогда это не имеет значения. Кроме того, использование директив mod_rewirte вне контекста каталога , возможно, «проще».

Однако синтаксис директив mod_rewrite в сервере (или virtualhost ) контекст отличается от контекста каталога , поэтому их необходимо слегка изменить.

Поскольку директивы в контексте server обрабатываются намного раньше, до запрос сопоставлен с файловой системой, вы можете t просто используйте серверную переменную REQUEST_FILENAME , чтобы получить запрошенное имя файла (которое обычно содержит абсолютное имя файла после , когда запрос был сопоставлен с файловой системой). Вы должны использовать вместо этого предвкушение. то есть. LA-U: REQUEST_FILENAME .

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

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

RewriteEngine On
RewriteCond %{LA-U:REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [L]

<Directory /var/www/>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
1
ответ дан 30 July 2020 в 22:10

Другие вопросы по тегам:

Похожие вопросы: