Як увімкнути 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, яку я вже мав ..
Якуб Арнольд

Чи можете ви змінити прийняту відповідь на цю ? Автор поточної прийнятої відповіді визнав, що це недостатньо добре.
Shadow Wizard є Ear for You

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
Ідеї ​​тут є правильними для UNIX CLI, але команди працюють лише для дистрибутивів Linux на базі Debian, а не для ОС Windows.
Джейсон Рікард

17
a2enmod переписати зробив цю роботу
доктор Каспер Блек

98
Подальша примітка: вам також потрібно переконатися, що в налаштуваннях вашого сайту є можливість AllowOverride Allдля того, щоб .htaccessфайл взагалі читався.
Адам Розенфілд

2
@Dennis ви можете використовувати 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
ЦІЙ шлях - я мав все інше, крім цього.
arrayown

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/ evidencesitenameSense.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 NoneнаAllowOverride All

це працювало для мене


Змінено помилку з /laravel/public/authors was not found on this serverна/index.php was not found on this server
Gangaraju

не можу знайти <Каталог>, лише <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

По-перше, може виникнути проблема у тому, що у вашому апачі не встановлено або увімкнено модуль mod_rewrite.c.

З цієї причини вам слід було б включити наступне

  1. Відкрийте консоль і введіть у неї таке:

    sudo a2enmod rewrite

  2. Перезавантажте сервер apache.

    service apache2 restart

Завдання 2

  1. Крім того, вище, якщо це не працює, вам доведеться змінити правило заміщення з файлу apache conf (або apache2.conf, http.conf або файл за замовчуванням 000).

  2. Знайдіть "Каталог / var / www /"

  3. Змініть "Замінити жодних" на "Замінити всіх"

Завдання 3

Якщо ви отримали помилку із зазначенням, що модуль перезапису не знайдено, можливо, ваш модуль userdir не ввімкнено. З цієї причини вам потрібно це включити.

  1. Введіть це в консоль:

    sudo a2enmod userdir

  2. Потім спробуйте увімкнути модуль перезапису, якщо він все ще не включений (як зазначено вище).

Щоб прочитати далі про це, ви можете відвідати цей веб-сайт: http://seventhsoulmountain.blogspot.com/2014/02/wordpress-permalink-ubuntu-problem-solutions.html


2
Велика розбивка питання.
Банаго

Не використовуйте, AllowOverride Allоскільки це дозволить отримати занадто багато функцій небезпеки (наприклад, використання скриптів Perl). Натомість використовуйтеAllowOveride Options
Marki555

28

Нова версія 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

Сподіваюся, це спрацює.


Це актуальна відповідь.
paulc

1
Якщо ви перебуваєте у 2019 році та пізніше, будь ласка, підтвердіть цю відповідь :)
Luiz Cavalcanti

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

<edit>

Щойно помітив, ви сказали, що mod_rewrite.s замість mod_rewrite.so - сподіваюся, що це помилка у вашому запитанні, а не у файлі httpd.conf! :)

</edit>

Я більше звик використовувати Apache в Linux, але мені довелося це робити днями.

Спочатку загляньте в каталог встановлення Apache. (Я припускаю, що ви встановили його тут на "C: \ Program Files")

Погляньте в папку: "C: \ Program Files \ Apache Software Foundation \ Apache2.2 \ модулі" і переконайтеся, що там є файл з назвою 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 твій аватар просто виглядав так, ніби він тримає піктограму мій документ, lol
Джонатан дос Сантос

5

Я щойно це зробив

sudo a2enmod rewrite

тоді вам доведеться перезапустити службу apache, виконавши команду

sudo service apache2 restart

4

Старий потік, просто хочу помістити, що не встановлює AllowOverride для всіх, а використовувати конкретний мод, який ви хочете використовувати,

AllowOverride mod_rewrite mod_mime

І цю лінію слід не коментувати

LoadModule rewrite_module modules/mod_rewrite.so

Відгуки


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.