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!
Предполагая, что ваш файл .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>