Введение в использование mod_rewrite. Введение в использование mod_rewrite Mod rewrite установка

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

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

Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all

Измените 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). Измените текст каталога таким образом

Options Indexes FollowSymLinks AllowOverride All Require all granted

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

Service apache2 reload

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

Open terminal и typin a2enmod rewrite , он включит ваш модуль mod_rewrite для Apache.

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

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

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

Теперь перезапустите 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 файл.

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

Вышеупомянутый файл.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). Это было разрешено только после добавления

Order allow,deny Allow from all AllowOverride All

к конфигурации виртуального хоста в файле vhost

Изменить на 29/09/2017 (для Apache 2.4 <) См. Этот ответ

DocumentRoot "E:/Documenten/Dropbox/Dropbox/dummy-htdocs" ServerName dropbox.local ErrorLog "logs/dropbox.local-error.log" CustomLog "logs/dropbox.local-access.log" combined # AllowOverride All # Deprecated # Order Allow,Deny # Deprecated # Allow from all # Deprecated # --New way of doing it Require all granted

Модуль 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:

Options Indexes FollowSymLinks AllowOverride All

3. Перезапуск конфигурации Apache2

После включения модуля mod_rewrite для Apache нужно перезагрузить сервер Apache2:

# service apache2 restart

Тема «Включить модуль mod_rewrite для Apache в Debian/Ubuntu» завершена.