Как включить 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.