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

399

У меня есть новая версия Apache 2.2 на моей машине Vista, все работает отлично, за исключением модификации mod.

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

LoadModule rewrite_module modules/mod_rewrite.s

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

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

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

  • 1
    на самом деле проблема была в том, что у меня был неправильный путь, потому что $ {DOCUMENT_ROOT} указал мне на корневой каталог, который был в порядке на хостинге, но не на локальном, так что проблема была не только в RewriteEngine On, который у меня уже был ..
  • 0
    Можете ли вы изменить принятый ответ на этот ? Автор текущего принятого ответа признал, что он недостаточно хорош.
Показать ещё 3 комментария
Теги:
mod-rewrite

16 ответов

841
Лучший ответ

Чтобы использовать 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 переписал сделал работу
Показать ещё 13 комментариев
204

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

RewriteEngine On

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

Решение моей проблемы состояло в том, чтобы отредактировать мою запись vhost для inccude

AllowOverride all

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

  • 9
    Действительно, даже если a2enmod rewrite & RewriteEngine On в .htaccess - существование AllowOverride all в файле VirtualHost помешает его работе - это то, что меня AllowOverride all , изменив его на AllowOverride all работало как AllowOverride all :)
  • 8
    начинающий здесь .. где находится файл VirtualHost?
Показать ещё 4 комментария
76

Я написал об этом в статье: http://www.jarrodoberto.com/articles/2011/11/enabling-mod-rewrite-on-ubuntu

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


Вторая наиболее распространенная проблема заключается не в том, что включен режим mod rewrite: a2enmod rewrite, а затем перезапустите apache.

  • 0
    потрясающее объяснение там. Спасибо :)
  • 0
    Это должен быть ответ № 1, поскольку он решает проблему, возникающую при установке Ubuntu по умолчанию!
Показать ещё 3 комментария
67

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

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

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

Измените AllowOverride None на AllowOverride All

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

  • 0
    Изменена ошибка из /laravel/public/authors was not found on this server чтобы /index.php was not found on this server
  • 0
    не могу найти <Directory>, только <VirtualHost *: 80>
Показать ещё 2 комментария
43

В Ubuntu:

Run:

a2enmod rewrite

а затем:

service apache2 restart

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

26

Существует множество способов устранения этой проблемы, если вы знаете корень проблемы.

Проблема 1

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

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

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

    sudo a2enmod rewrite

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

    service apache2 restart

Проблема 2

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

  • Найдите "Каталог/var/www/"

  • Измените "Override None" на "Override All"

Проблема 3

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

  • Введите это в консоль:

    sudo a2enmod userdir

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

Для дальнейшего ознакомления с этим вы можете посетить этот сайт: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html

  • 2
    Отличная разбивка вопроса.
  • 0
    Не используйте AllowOverride All как он задействует слишком много функций опасных функций (например, использование сценариев perl). Вместо этого используйте AllowOveride Options
25

Откройте терминал и введите 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-адреса, и на этот раз он будет передан.

  • 0
    Это сработало для меня на Laravel 5. Спасибо!
16

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

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

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

service apache2 reload

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

  • 0
    и да, это работает.
  • 0
    Это актуальный ответ.
Показать ещё 1 комментарий
13

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

Просто заметил, что вы сказали 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.

  • 0
    Это правильный ответ на заданный вопрос.
  • 0
    @ gabehabe твой аватар только что выглядел так, словно на нем была иконка мой доктор, лол
4

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

sudo a2enmod rewrite

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

sudo service apache2 restart
3

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

ErrorDocument 404 /index.php?page=404
2

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

AllowOverride mod_rewrite mod_mime

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

LoadModule rewrite_module modules/mod_rewrite.so

Refrences

2

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

2

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

# 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

1

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

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

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

0

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

sudo a2enmod rewrite

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

sudo service apache2 restart

Ещё вопросы

Сообщество Overcoder
Наверх
Меню