.htaccess не работает apache


135

У меня есть сервер из сервиса AWS EC2, работающий в Linux Ubuntu, и я установил apache, php и mysql.

Я добавил .htaccessфайл в корень моего документа /var/www/html.

Я ввел этот код в нем: ErrorDocument 404 /var/www/html/404.phpи он до сих пор не появляется.

Я продолжал вводить эту команду несколько раз: sudo service httpd restartперезагрузить сервер, но без изменений ...

Как я могу это исправить ... Я сделал что-то не так?

Заранее спасибо!


2
Вы уверены, что хотите сопоставить 400 Bad Requestошибку /var/www/html/404.php?
Джон Лин

Ответы:


288

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

Во-вторых, если файлы .htaccess игнорируются, вам необходимо проверить, правильно ли установлен AllowOverride. См. Http://httpd.apache.org/docs/2.4/mod/core.html#allowoverride для получения подробной информации. Вы также должны убедиться, что он установлен в правильной области - то есть в правильном блоке в вашей конфигурации. Убедитесь, что вы НЕ редактируете, например, блок.

В-третьих, если вы хотите убедиться, что файл .htaccess действительно читается, поместите в него мусор. Недопустимая строка, такая как «INVALID LINE HERE», в вашем файле .htaccess приведет к ошибке 500 Server, когда вы укажете браузеру на каталог, содержащий этот файл. Если это не так, то у вас не настроен AllowOverride правильно.


141
+1 за размещение мусора в файле .htaccess в качестве диагностического инструмента.
ретрохакер

46
Мусор в программировании полезнее, чем кажется.
EnKrypt

1
Я поместил "A STRING" в свой .htaccess, поэтому я получил ошибку, поэтому я вставил AllowOverride Allвсе apache2.confв своем Debian, и это работает
Alex

1
Обратите внимание, что AllowOverrideработает только в <Directory>директивах и будет игнорироваться, если помещен в <Location ...>раздел, см. Httpd.apache.org/docs/2.4/mod/core.html#allowoverride
Даниэль Соколовский,

2
Также обратите внимание, что <Directory>директива ожидает абсолютный путь вместо относительного. В моем случае <Directory /> не получилось, пока <Directory /var/www/html/subdir>работал.
Лукас Кнут

115
  1. Включить модуль Apache mod_rewrite

    a2enmod rewrite

  2. добавьте следующий код в /etc/apache2/sites-available/default

    AllowOverride All

  3. Перезапустите Apache

    /etc/init.d/apache2 restart


7
обратите внимание, что в Apache 2.4 файлы конфигурации в / etc / apache2 / sites-available теперь должны заканчиваться на .conf. И у меня была
небольшая путаница

2
Спасибо, в моем случае перезапись не была включена по умолчанию в apache2
Cross

я уже выполняю эти шаги, но в apache 2.4 это не работает, что я делаю неправильно = [
Лучано Андресс Мартини,

Похоже, требуют, чтобы переопределения ip требовали аутентификацию, это поведение является неожиданным (разрешить для определенного ip в apache 2.2 не делать этого) и, на мой взгляд, может быть очень опасным, потому что исключение ip аннулирует аутентификацию, в apache 2.2 это совершенно разные вещи. !
Лучано Андресс Мартини

Я пропустил первый шаг, но изменил AllowOverride на All в моем apache.conf (Debian 8, /etc/apache2/apache.conf), перезапустил и файлы не доступны, хорошо. Но ошибка не похожа на отказ в разрешении, а на 500 Internal Server Error, почему? Могу ли я это исправить?
dasLort

44

Если вы перепробовали все вышеперечисленное, которые являются действительными и хорошими ответами, и ваш файл htaccess не работает или читается, измените директиву в apache2.confфайле. Под Ubuntu путь/etc/apache2/apache2.conf

Измените <Directory>директиву, указывающую на ваши общедоступные веб-страницы, где находится файл htaccess. Изменить с AllowOverride NoneнаAllowOverride All

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

У меня была такая же проблема, и я нашел ответ и объяснение в Ubuntu Ask! форум /ubuntu/421233/enabling-htaccess-file-to-rewrite-path-not-working


2
Или, это может быть добавлено на VHost
ssi-anik

На самом деле, AllowOverride FileInfoтребуется только 3-я строка для .htaccessчтения и использования файла. Allтакже включает дополнительные переопределения конфигурации, такие как .httpasswd(которые можно включить отдельно, используя Authconfigвместо All).
Рафал

20

Для Ubuntu, во-
первых, запустите эту команду: -

sudo a2enmod rewrite

Затем отредактируйте файл, /etc/apache2/sites-available/000-default.confиспользуя nano или vim, используя эту команду: -

sudo nano /etc/apache2/sites-available/000-default.conf

Затем в 000-default.confфайле добавьте это после строки DocumentRoot /var/www/html. Если ваш корневой каталог html - это что-то другое, то напишите:

<Directory "/var/www/html">
  AllowOverride All
</Directory>

Сделав все, перезапустите apache с помощью команды sudo service apache2 restart


6

Просто выполните 3 шага

  1. Включите mode_rewrite, используя следующую команду

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

Пароль будет запрошен. Так что введите свой пароль

  1. Обновите файл 000-default.conf или default.conf, расположенный в каталоге / etc / apache2 / sites-available / . Вы не можете редактировать его напрямую. поэтому используйте следующую команду, чтобы открыть

    sudo gedit /etc/apache2/sites-available/000-default.conf

Или sudo gedit /etc/apache2/sites-available/default.conf

ты получишь

DocumentRoot / var / www / html

ИЛИ

DocumentRoot / var / www

линия. Добавьте следующий код после него.

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

Сделайте так, чтобы путь к тегу каталога был таким же, как показано в вашем файле.

  1. Перезагрузите сервер apache, используя следующую команду

    перезапуск службы sudo apache2


Спасибо. Привет из Бразилии.
Fox.11

5

Скорее всего, для AllowOverride установлено значение None. в разделе каталога apache2.conf, расположенном в папке / etc / apache2

Попробуйте установить для него AllowOverride All


5

По моему опыту, директива / var / www / directory запрещает директивы virtualhost в подпапках. Так что, если вы перепробовали все предложения и все еще не работали, и вы используете виртуальные хосты, попробуйте это;

1 - Убедитесь, что у вас есть AllowOverride Allдиректива в /etc/apache2/sites-available/example.com.conf

2 - Проверьте директивы / var / www / Directory в /etc/apache2/apache2.conf(возможно, в строке 164), как это выглядит;

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

Если есть AllowOverride Noneдиректива, измените ее AllowOverride All или просто экранируйте


3

По умолчанию Apache запрещает использование файла .htaccess для применения правил перезаписи, поэтому

Шаг 1 - Включение mod_rewrite (если не включено) Сначала нам нужно активировать mod_rewrite. Он доступен, но не включен с чистой установкой Apache 2.

$ sudo a2enmod rewrite

Это активирует модуль или предупредит вас, что модуль уже включен. Чтобы эти изменения вступили в силу, перезапустите Apache.

$ sudo systemctl restart apache2

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

Шаг 2 - Настройка .htaccess Откройте файл конфигурации Apache по умолчанию, используя nano или ваш любимый текстовый редактор.

$ sudo nano /etc/apache2/sites-available/000-default.conf

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

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    . . . 
</VirtualHost>

Сохраните и закройте файл. Чтобы эти изменения вступили в силу, перезапустите Apache.

$ sudo systemctl restart apache2

Готово. Ваш .htacess должен работать. Эта ссылка может действительно помочь кому-то https://www.digitalocean.com/community/tutorials/how-to-rewrite-urls-with-mod_rewrite-for-apache-on-ubuntu-16-04


Команда перезапуска, которая работала для меня, - $ sudo httpd -k restart(Red Hat 4.4.7-23)
Гималаи Гарг


1

В WampServerOpen WampServer Tray значок ----> Apache ---> Модули Apache ---> rewrite_module



0

Для полноты, если «AllowOverride All» не решит вашу проблему, вы можете отладить эту проблему, используя:

  1. Запустите apachectl -Sи посмотрите, если у вас есть более одного namevhost. Возможно, httpd ищет .htaccess другого DocumentRoot.

  2. Используйте strace -f apachectl -Xи найдите, куда он загружается (или не загружается) .htaccess.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.