andew
2015-02-13T11:59:58+00:00
2018-03-02T04:50:41+00:00
42066
В статье я привожу описание логики работы правилаRewriteRule и синтаксис некоторых директив модуля mod_rewrite сервера Apache. Также я выделил и обобщил несколько выводов-постулатов, которые, как мне кажется, нужно обязательно знать и понимать при использовании этого модуля. Надеюсь, что все это позволит вам, так же, как и мне ранее, разобраться с работой этого модуля, предоставляющего мощный функционал для выполнения различных преобразований над URL .
Не забывайте в регулярном выражении экранировать служебные символы. Иногда забывают экранировать точку, когда она должна выступать именно как точка, а не как принято в регулярном выражении - как любой символ.
Также не забывайте оборачивать весь блок правил для mod_rewrite
в тег:
Не пишите излишне много директив для mod_rewrite , пишите только те правила преобразования, которые вам действительно необходимы. Особенно нужно быть аккуратным с внешними ридиректами - это такие ридиректы, которые выполняются путем отправки клиенту серверного заголовка с кодом НЕ 200 (отдача полноценной страницы), а с другим кодом (чаше всего 301 и 302 ) и которые приводят к перенаправлению в браузере клиента на другой URL т.е. к совершению нового запроса на клиенте. Поэтому любой внешний ридирект всегда приводит к потере времени в обработки запроса, т.к. нужно отправить клиенту ответ, он должен его прочитать, и повторить запрос уже по новому URL. Это затратная по времени процедура. Поэтому ридиректы должны быть только если они действительно вам необходимы.
Учитывайте, что браузеры могут кешировать редиректы, при этом Ctrl+F5 или Ctrl+R не снимает проблему. Поэтому отключайте кеширование в браузере при тестировании ваших правил rewrite модуля web сервера Apache .
Для поиска ошибок работы ваших правил читайте логи Apache .
Не делайте тупой копи-паст директив из различных статей в интернете в свои файлы настроек apache. Cтатьи пишут люди и поэтому возможны ошибочные написания директив, и если учесть, что метод написания статей также подразумевает активное использование копипаста, то ошибки могут распространяться и множиться. Используйте статьи только как справку, а в свои настроечные файлы вписываете директивы из руководств. Хотя это тоже не гарантирует на сто процентов от ошибок, но хотя бы вы из минимизируете.
В этой статье я описал только две директивы и главные на мой взгляд понятия. Однако, как сами понимаете, mod_rewrite предоставляет много других директив и функционала.
rewritecond rewriterule (13)
У меня новая версия Apache 2.2 на моей машине Vista, все работает нормально, кроме мод-переписывания.
Я раскоментировал
LoadModule rewrite_module modules/mod_rewrite.s
но ни одно из моих правил перезаписи не работает, даже простые
RewriteRule not_found %{DOCUMENT_ROOT}/index.php?page=404
Все правила, которые я использую, работают на моем хостинге, поэтому они должны быть в порядке, так что мой вопрос в том, есть ли скрытая вещь в конфигурации apache, которая может блокировать переписывание мода?
Если не указано выше, попробуйте отредактировать / etc / apache2 / sites-enabled / 000-default
почти на вершине вы найдете
Измените AllowOverride None на AllowOverride All
это сработало для меня
Очевидно, есть более чем один способ сделать это, но я бы предложил использовать более стандартный:
ErrorDocument 404 /index.php?page=404
Я бы настоятельно советовал всем, кто хочет включить директивы mod_rewrite в файлах.htacces, чтобы использовать AllowOverride FileInfo вместо того, чтобы разрешать все, как предлагают ВСЕ ответы на этой странице. Грустно видеть, что все эти ответы используют подход «как-давно-работает-это-хорошо», а не пытаться понять последствия предлагаемого «решения». Постарайтесь понять, что вы делаете на своем сервере, и как ограничить привилегии, которые вы только что дали с помощью AllowOverride All . RTFM! , это совершенно очевидно по этому вопросу. Давай, парни, это не ракеты, это просто веб-сервер!
Что сработало для меня (в ubuntu):
Sudo su cd /etc/apache2/mods-enabled ln ../mods-available/rewrite.load rewrite.load
Также, как уже упоминалось, убедитесь, что AllowOverride all установлено в соответствующем разделе /etc/apache2/sites-available/default
Для моей ситуации у меня было
RewriteEngine On
в моем.htaccess , вместе с загружаемым модулем, и он не работал.
Решение моей проблемы состояло в том, чтобы отредактировать мою запись vhost для inlcude
AllowOverride all
в разделе
В первый раз, когда я боролся с правилами mod_rewrite, игнорируя свой трафик, я узнал (разочаровывающе), что я поместил их в неправильный
# 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
Я просто сделал это
Sudo a2enmod rewrite
то вам необходимо перезапустить службу apache, следуя команде
Sudo service apache2 restart
Новая версия Apache в какой-то мере изменилась. Если ваша версия apache равна 2,4, вам нужно перейти в /etc/apache2/ . Будет файл с именем apache2.conf . Вы должны отредактировать его (у вас должно быть разрешение root). Измените текст каталога таким образом
Теперь перезапустите apache.
Service apache2 reload
Надеюсь, что это работает.
Open terminal и typin a2enmod rewrite , он включит ваш модуль mod_rewrite для Apache.
Затем перейдите в /etc/apache2/sites-available и отредактируйте файл по умолчанию. (Для этого у вас должны быть права на доступ к этому файлу и доступной папке.)
Заменить ниже существующими строками от 4 до 14
DocumentRoot /var/www
Теперь перезапустите apache с помощью /etc/init.d/apache2 restart или service apache2 restart
Повторите очистить URL-тест, и на этот раз он будет передан.
Попробуйте установить: AllowOverride All .
Вторая наиболее распространенная проблема заключается не в том, что включена a2enmod rewrite мод: a2enmod rewrite а затем перезапустить apache.
A2enmod rewrite
Service apache2 restart
mod_rewrite теперь будет включен!
Старый поток, просто хочу поставить, что не устанавливайте AllowOverride для всех, а используйте специальный мод, который вы хотите использовать,
AllowOverride mod_rewrite mod_mime
И эта строка должна быть прокомментирована
LoadModule rewrite_module modules/mod_rewrite.so
Чтобы использовать mod_rewrite вы можете ввести следующую команду в терминал:
Sudo a2enmod rewrite
Перезапустить apache2 после
Sudo /etc/init.d/apache2 restart
Sudo service apache2 restart
или в соответствии с новым унифицированным способом управления системой
Sudo systemctl restart apache2
Затем, если хотите, вы можете использовать следующий.htaccess файл.
Вышеупомянутый файл.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 не будут доступны.
mod_rewrite включить (7)
Нет, mod_rewrite - это модуль Apache и не имеет ничего общего с PHP.
Чтобы активировать модуль, следующая строка в httpd.conf должна быть активной:
LoadModule rewrite_module modules/mod_rewrite.so
чтобы убедиться, что он уже активен, попробуйте поместить файл.htaccess в веб-каталог, содержащий строку
RewriteEngine on
если это работает, не выкидывая ошибку внутреннего внутреннего сервера 500, а файл.htaccess обрабатывается, выполняется переписывание URL-адресов.
Если я правильно понял, мне нужно добавить что-то в httpd.config чтобы включить mod_rewrite. Если это так, что мне нужно добавить в httpd.conf или apache.conf ? Пожалуйста, укажите ОС.
Нет, вам не нужно. mod_rewrite - это модуль Apache. Это не имеет никакого отношения к php.ini .
В моем случае проблема возникла даже после всех этих конфигураций (@Pekka упомянул об изменениях в файлах httpd.conf и.htaccess). Это было разрешено только после добавления
к конфигурации виртуального хоста в файле vhost
Изменить на 29/09/2017 (для Apache 2.4 <) См. Этот ответ
Модуль rewrite_module встроен в сервер в большинстве случаев
Использовать.htaccess
Используйте генератор перезаписи мод по адресу http://www.generateit.net/mod-rewrite/
сетевые решения предлагают совет поместить php.ini в cgi-bin, чтобы включить mod_rewrite
Чтобы использовать mod_rewrite, вы можете ввести следующую команду в терминал:
$ su $ passwd ********** # a2enmod rewrite
Перезапустить apache2 после
# service apache2 restart # /etc/init.d/apache2 restart
# service apache2 restart
Просто fyi для людей, поддерживающих mod_rewrite на Debian с Apache2:
Чтобы проверить, включен ли mod_rewrite:
Ls /etc/apache2/mods-enabled | grep rewrite
Если это выдает rewrite.load тогда модуль включен. (Примечание: ваш путь к apache2 может не быть / etc /, хотя это, вероятно, будет.)
Чтобы включить mod_rewrite, если это еще не сделано :
A2enmod rewrite
Перезагрузите все файлы конфигурации apache.
Важно :
Поддержка файла «.htaccess»
есть только на хостинге Linux. На Windows хостинге функцию «.htaccess»
выполняет файл web.config
.
Модуль поддержки «.htaccess» доступен на всех тарифах виртуального хостинга на основе ОС Linux. Если при установке CMS появляется сообщение об отсутствии поддержки «.htaccess» просто проигнорируйте его.
У меня нет файла.htaccess, что делать?
Если вы настраиваете web-сервер Apache, но у вас нет файла .htaccess , создайте его и пропишите нужные директивы.
Чтобы создать .htaccess , войдите в панель управления хостингом по инструкции: Расположите файл .htaccess в каталоге сайта с помощью статьи: .
Если вы случайно удалили файл .htaccess , восстановите его . Или добавить стандартный файл .htaccess для вашей CMS:
В cPanel не видно файла.htaccess
Чтобы увидеть скрытые файлы (начинающиеся с точки) в cPanel, необходимо выполнить следующие действия:
Как включить mod rewrite?
Модуль «mod_rewrite» присутствует на всех тарифных планах хостинга Linux. Чтобы активировать «mod_rewrite» добавьте в файл .htaccess строку вида.
Иногда люди сталкиваются с проблемой — сервер apache не читает ваш файл.htaccess или apache не переписывает URL, а мы используем правильные правила перезаписи в конфигурационных файлах. Это происходит из-за того, что модуль rewrite не включен в apache. Т.к модуль mod_rewrite не включен по умолчанию на сервер, поэтому для использования rewrite, нужно вручную включить mode_rewrite. В моей статье «Включить модуль mod_rewrite для Apache в Debian/Ubuntu» я расскажу как я это могу сделать.
1. Включение модуля mod_rewrite в Apache2
Для этого, я использую команду «a2enmod», чтобы включить любые модули в веб-сервере Apache 2. Так что, используйте следующую команду чтобы включить mod_rewrite модуль для apache:
$ sudo a2enmod rewrite
2. Активировать ReWrite в вирутальном хосте
После включения модуля ReWrite для Apache необходимо добавить «AllowOverride All» в вашем файле конфигурации для виртуального хоста. Этот параметр также может быть включен в глобальном масштабе, путем редактирования основного файла конфигурации apache:
3. Перезапуск конфигурации Apache2
После включения модуля mod_rewrite для Apache нужно перезагрузить сервер Apache2:
# service apache2 restart
Тема «Включить модуль mod_rewrite для Apache в Debian/Ubuntu» завершена.