Как включить mod_rewrite для Apache 2.2
У меня новая версия Apache 2.2 на моей машине с Vista, все работает отлично, кроме переписывания модов.
Я не комментировал
LoadModule rewrite_module modules/mod_rewrite.s
но ни одно из моих правил перезаписи не работает, даже такие простые, как
RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404
Все правила, которые я использую, работают на моем хостинге, поэтому они должны быть в порядке, поэтому мой вопрос, есть ли скрытая вещь в конфигурации apache, которая может блокировать переписывание модов?
15 ответов
Для того, чтобы использовать 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
не будет доступен.
Для моей ситуации у меня было
RewriteEngine On
в моем .htaccess
вместе с загружаемым модулем, и он не работал.
Решением моей проблемы было редактирование моей записи vhost в inlcude
AllowOverride all
в <Directory>
раздел для рассматриваемого сайта.
Я написал об этом в статье: http://www.jarrodoberto.com/articles/2011/11/enabling-mod-rewrite-on-ubuntu
Попробуйте установить: AllowOverride All
,
Второй наиболее распространенной проблемой является отсутствие перезаписи модов: a2enmod rewrite
а затем перезапустите Apache.
Если ничего из вышеперечисленного не работает, попробуйте отредактировать /etc/apache2/sites-enabled/000-default
почти наверху вы найдете
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
Изменить AllowOverride None
в AllowOverride All
это сработало для меня
Новая версия apache изменилась каким-то образом. Если ваша версия Apache 2.4, то вам нужно перейти на /etc/apache2/
, Там будет файл с именем apache2.conf
, Вы должны отредактировать это (у вас должны быть права суперпользователя). Изменить текст каталога следующим образом
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Теперь перезапустите Apache.
service apache2 reload
Надеюсь, что это работает.
В Ubuntu:
Бежать:
a2enmod rewrite
а потом:
service apache2 restart
mod_rewrite
теперь будет включен!
Есть много способов, как вы можете решить эту проблему, если вы знаете корень проблемы.
Проблема 1
Во-первых, это может быть проблема с вашим apache, у которого не установлен или не включен модуль mod_rewrite.c.
По этой причине вы должны включить его следующим образом
Откройте консоль и введите в нее:
sudo a2enmod rewrite
Перезагрузите сервер Apache.
service apache2 restart
Проблема 2
Вы также можете, в дополнение к вышесказанному, если это не сработает, изменить правило переопределения из файла apache conf (либо apache2.conf, http.conf, либо файл 000-default).
Найдите "Каталог /var/www/"
Измените "Переопределить Нет" на "Переопределить все"
Проблема 3
Если вы получаете сообщение о том, что модуль перезаписи не найден, то, вероятно, ваш модуль userdir не включен. По этой причине вам нужно включить его.
Введите это в консоли:
sudo a2enmod userdir
Затем попробуйте включить модуль перезаписи, если он все еще не включен (как упомянуто выше).
Чтобы узнать больше об этом, вы можете посетить этот сайт: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html
Откройте терминал и введите 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 и на этот раз оно будет пройдено.
<редактировать>
Только что заметил, что вы сказали 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.
Используйте команду ниже
sudo a2enmod rewrite
И перезапустите apache через команду ниже
sudo service apache2 restart
Я только что сделал это
sudo a2enmod rewrite
Затем вы должны перезапустить службу Apache, выполнив следующую команду
sudo service apache2 restart
Старый поток, просто хочу поставить, чтобы не устанавливать AllowOverride на все, вместо этого использовать конкретный мод, который вы хотите использовать,
AllowOverride mod_rewrite mod_mime
И эта строка должна быть без комментариев
LoadModule rewrite_module modules/mod_rewrite.so
Refrences
В первый раз, когда я боролся с правилами 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
Очевидно, есть несколько способов сделать это, но я бы предложил использовать более стандартный:
ErrorDocument 404 /index.php?page=404
Что сработало для меня (в Ubuntu):
sudo su
cd /etc/apache2/mods-enabled
ln ../mods-available/rewrite.load rewrite.load
Также, как уже упоминалось, убедитесь, что AllowOverride all
устанавливается в соответствующем разделе /etc/apache2/sites-available/default
Я настоятельно рекомендую всем, кто хочет включить директивы mod_rewrite в файлах.htacces, использовать AllowOverride FileInfo
вместо того, чтобы разрешить все, как ВСЕ ответы на этой странице предлагают. Грустно видеть, что все эти ответы используют подход "пока все работает, все в порядке" вместо того, чтобы пытаться понять последствия предлагаемого "решения". Постарайтесь понять, что вы делаете на своем сервере и как ограничить привилегии, которые вы только что отдали AllowOverride All
, RTFM!, вполне понятно по этому вопросу. Давай, парни, это не ракетостроение, это просто веб-сервер!