Как включить mod_rewrite для Apache 2.2


474

У меня новая версия Apache 2.2 на моей машине с Vista, все работает отлично, кроме переписывания модов.

Я не комментировал

LoadModule rewrite_module modules/mod_rewrite.s

но ни одно из моих правил перезаписи не работает, даже такие простые, как

RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404

Все правила, которые я использую, работают на моем хостинге, поэтому они должны быть в порядке, поэтому мой вопрос, есть ли скрытая вещь в конфигурации apache, которая может блокировать перезапись модов?


1
на самом деле проблема была в том, что у меня был неправильный путь, потому что $ {DOCUMENT_ROOT} указал мне на корневой каталог, который был в порядке на хостинге, но не на локальном, так что проблема была не в RewriteEngine On, который у меня уже был ..
Якуб Арнольд

Можете ли вы изменить принятый ответ на этот ? Автор текущего принятого ответа признал, что он недостаточно хорош.
Мастер теней - это ухо для тебя

1
Как включить mod_rewrite в Ubuntu 12.04 LTS (должно работать и в Debian) . Это показывает установку и активацию, учебники ниже удивительно не делают :(
Sliq

3
Я настоятельно рекомендую всем, кто хочет включить директивы mod_rewrite в файлах .htacces, использовать AllowOverride FileInfoвместо того, чтобы разрешать все, как ВСЕ ответы на этой странице. Грустно видеть, что все эти ответы используют подход «пока все работает, все в порядке» вместо того, чтобы пытаться понять последствия предложенного «решения». Постарайтесь понять, что вы делаете на своем сервере и как ограничить привилегии, которые вы только что отдали AllowOverride All. RTFM! Тут вполне понятно по теме.
RemyNL

1
@Black Это в конфигурационном файле Apache с именем httpd.conf. На моем ПК он находится в каталоге C: \ xampp \ apache \ conf, потому что я установил Apache с XAMPP.
Lex Soft

Ответы:


1005

Для использования mod_rewriteвы можете ввести следующую команду в терминале:

sudo a2enmod rewrite

Перезапустите apache2 после

sudo /etc/init.d/apache2 restart

или

sudo service apache2 restart

или в соответствии с новым унифицированным способом управления системой

sudo systemctl restart apache2

Затем, если вы хотите, вы можете использовать следующий .htaccessфайл.

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

Приведенный выше .htaccessфайл (если он размещен в вашем DocumentRoot) перенаправит весь трафик в index.phpфайл, DocumentRootесли он не существует.

Итак, допустим, у вас есть следующая структура каталогов и httpdocs является DocumentRoot

httpdocs/
    .htaccess
    index.php
    images/
        hello.png
    js/
        jquery.js
    css/
        style.css
includes/
    app/
        app.php

Любой файл, который существует в httpdocs, будет передан запрашивающей стороне, как .htaccessпоказано выше, однако все остальное будет перенаправлено httpdocs/index.php. Ваши файлы приложений в includes/appне будут доступны.


15
Идеи здесь верны для CLI UNIX, но команды работают только для дистрибутивов Linux на основе Debian, а не для среды Windows OP.
Джейсон Рикард

17
Переписать a2enmod сделал работу
доктор Каспер Блэк

98
Примечание: вам также необходимо убедиться, что конфигурация вашего сайта соответствует тому, AllowOverride Allчтобы .htaccessфайл вообще читался.
Адам Розенфилд

2
@ Денис, вы можете использовать a2dismod rewrite
Джонатан Майхак,

3
Как я могу использовать a2enmod rewriteв Windows?
Наман

229

Для моей ситуации у меня было

RewriteEngine On

в моем .htaccess , вместе с модулем загружается, и он не работает.

Решением моей проблемы было редактирование моей записи vhost в inlcude

AllowOverride all

в <Directory>разделе для рассматриваемого сайта.


10
В самом деле, даже с a2enmod rewrite& RewriteEngine Onin .htaccess- наличие AllowOverride allв файле VirtualHost не позволит ему работать - это то, что меня AllowOverride all
поразило

9
начинающий здесь .. где находится файл VirtualHost?
Давнеет

3
Это путь ... У меня было все остальное, кроме этого.
Массив

2
AllowOverrideДиректива определяет «Тип директив, которые разрешены в .htaccessфайлах». Кроме того, «Когда эта директива установлена None, .htaccessфайлы полностью игнорируются. В этом случае сервер даже не будет пытаться читать .htaccessфайлы в файловой системе». Официальные документы: httpd.apache.org/docs/2.2/mod/core.html#allowoverride
Джон Эрк

Это исправило это для меня - у меня была проблема с довольно постоянными ссылками на WordPress. Если вы это сделаете, a2enmod rewriteа затем в файле VirtualHosts измените «AllowOverride None» на «AllowOverride All», это должно работать. Файл VirtualHosts применяется, если вы используете несколько доменных имен на одном сервере (и IP-адрес). Вы бы настроили его для настройки домена.
Джейсон Престон

83

Попробуйте установить: AllowOverride All.


Второй наиболее распространенной проблемой является отсутствие перезаписи мода: a2enmod rewriteзатем перезапустите apache.


Это должен быть ответ № 1, поскольку он решает проблему, возникающую при установке Ubuntu по умолчанию!
Sliq

1
Это позволит .htaccess переопределить любую другую конфигурацию apache. Это не рекомендуется.
Бхаргав Нанекалва

Да, это тоже была моя проблема, но здесь вы объясняете новичкам, таким как я, что «AllowOverride All» находится в /etc/apache2/sites-available/[sitename].conf и [sitename-ssl] .conf. Мне пришлось сделать второе исследование из-за вас: D, спасибо, кстати!
MetaTron

77

Если ничего из вышеперечисленного не работает, попробуйте отредактировать / etc / apache2 / sites-enabled / 000-default

почти наверху вы найдете

<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>

Изменение AllowOverride NoneToAllowOverride All

это сработало для меня


Изменена ошибка с /laravel/public/authors was not found on this serverна/index.php was not found on this server
Gangaraju

не могу найти <Directory>, только <VirtualHost *: 80>
Nicolas S.Xu

1
@ NicolasS.Xu поместите это в тег <VirtualHost *: 80>
wimdetr

Я сделал то же самое, но добавил новый раздел, <Directory /var/www/html>чтобы применить правило из этой папки и только вверх.
Луи Лоудог Троттье

44

В Ubuntu:

Запустить:

a2enmod rewrite

а потом:

service apache2 restart

mod_rewrite теперь будет включен!


28

Есть много способов, как вы можете решить эту проблему, если вы знаете корень проблемы.

Проблема 1

Во-первых, это может быть проблема с вашим apache, у которого не установлен или не включен модуль mod_rewrite.c.

По этой причине вы должны включить его следующим образом

  1. Откройте консоль и введите в нее:

    sudo a2enmod rewrite

  2. Перезагрузите сервер apache.

    service apache2 restart

Проблема 2

  1. Вы также можете, в дополнение к вышесказанному, если это не работает, изменить правило переопределения из файла apache conf (либо apache2.conf, http.conf, либо файл 000-default).

  2. Найдите «Каталог / var / www /»

  3. Измените «Переопределить Нет» на «Переопределить все»

Проблема 3

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

  1. Введите это в консоли:

    sudo a2enmod userdir

  2. Затем попробуйте включить модуль перезаписи, если он все еще не включен (как упомянуто выше).

Чтобы узнать больше об этом, вы можете посетить этот сайт: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html


2
Отличная разбивка вопроса.
Banago

Не используйте AllowOverride Allего, так как он задействует слишком много функций опасностей (например, использование сценариев perl). Вместо этого используйтеAllowOveride Options
Marki555

28

Новая версия apache изменилась каким-то образом. Если ваша версия Apache 2.4, то вам нужно перейти на /etc/apache2/. Там будет файл с именем apache2.conf. Вы должны отредактировать это (у вас должны быть права суперпользователя). Изменить текст каталога следующим образом

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

Теперь перезапустите Apache.

service apache2 reload

Надеюсь, что это работает.


Это актуальный ответ.
Пол

1
Если вы находитесь в 2019 году и далее, пожалуйста, проголосуйте за этот ответ :)
Луис Кавальканти

27

Откройте терминал и введите его a2enmod rewrite, он включит ваш mod_rewriteмодуль для Apache.

Затем перейдите /etc/apache2/sites-availableи отредактируйте файл по умолчанию. (Для этого у вас должны быть права на запись в этот файл и в папку с доступными сайтами.)

Заменить ниже существующими строками с 4 по 14

DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>

Теперь перезапустите ваш Apache с помощью /etc/init.d/apache2 restartилиservice apache2 restart

Снова проведите тестирование чистого URL, и на этот раз оно будет пройдено.


15

<Редактировать>

Только что заметил, что вы сказали mod_rewrite.s вместо mod_rewrite.so - надеюсь, это опечатка в вашем вопросе, а не в файле httpd.conf! :)

</ Редактирование>

Я более привык использовать Apache в Linux, но мне пришлось сделать это на днях.

Прежде всего, загляните в каталог установки Apache. (Я предполагаю, что вы установили его в «C: \ Program Files» здесь)

Посмотрите в папку: «C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ modules» и убедитесь, что там есть файл с именем mod_rewrite.so. (Должно быть, это предусмотрено как часть установки по умолчанию.

Затем откройте «C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ conf» и откройте httpd.conf. Убедитесь, что строка:

#LoadModule rewrite_module modules/mod_rewrite.so

не комментируется:

LoadModule rewrite_module modules/mod_rewrite.so

Кроме того, если вы хотите включить RewriteEngine по умолчанию, вы можете добавить что-то вроде

<IfModule mod_rewrite>
    RewriteEngine On
</IfModule>

в конец вашего файла httpd.conf.

Если нет, обязательно укажите

RewriteEngine On

где-то в вашем файле .htaccess.


@ gabehabe твой аватар только что выглядел так, словно на нем была иконка «Мой документ», лол
Джонатан душ Сантос

5

Я только что сделал это

sudo a2enmod rewrite

Затем вы должны перезапустить службу Apache, выполнив следующую команду

sudo service apache2 restart

4

Старый поток, просто хочу поставить, чтобы не устанавливать AllowOverride на все, вместо этого использовать конкретный мод, который вы хотите использовать,

AllowOverride mod_rewrite mod_mime

И эта строка должна быть без комментариев

LoadModule rewrite_module modules/mod_rewrite.so

Refrences


4

Используйте команду ниже

sudo a2enmod rewrite

И перезапустите apache через команду ниже

sudo service apache2 restart

3

Очевидно, есть несколько способов сделать это, но я бы предложил использовать более стандартный:

ErrorDocument 404 /index.php?page=404

3

В первый раз, когда я боролся с правилами mod_rewrite, игнорирующими мой трафик, я узнал (расстраивающе), что неправильно их разместил <VirtualHost>, что означало, что мой трафик будет игнорировать их все, независимо от того, насколько хорошо они написаны. Убедитесь, что это не происходит с вами:

# Change the log location to suit your system. RewriteLog /var/log/apache-rw.log RewriteLogLevel 2

Эти параметры активируются, если вы выполняете изящный перезапуск Apache, поэтому вы можете перерабатывать их и внимательно следить за поведением mod_rewrite. Как только ваша проблема будет решена, поверните RewriteLogLevel вниз и отпразднуйте это.

На 100% моего опыта я обнаружил, что RewriteLog помог мне обнаружить проблему с моими правилами перезаписи. Я не могу рекомендовать это достаточно. Удачи в устранении неполадок!

Кроме того, эта закладка - ваш лучший друг: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritelog


2

Что сработало для меня (в Ubuntu):

sudo su
cd /etc/apache2/mods-enabled
ln ../mods-available/rewrite.load rewrite.load

Также, как уже упоминалось, убедитесь, что AllowOverride allустановлено в соответствующем разделе/etc/apache2/sites-available/default

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