Назад | Перейти на главную страницу

Почему правила .htaccess не работают в Linux (ubuntu 14.04)

Я скопировал сайт со своей машины Windows, на которой запущен WAMP, на машину Linux со стандартным стеком LAMP.

Все работает нормально, кроме правил в .htaccess. Я подтвердил, что .htaccess работает, проверив простое правило, поэтому я знаю, что он не имеет ничего общего с конфигурацией apache. Эти правила отлично работают на моей машине с Windows.

Вот копия правил из моего файла .htaccess.

RewriteRule ^admin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/$ index.php?admin=1&class=$1&id=$2&method=$3 [L,QSA]
RewriteRule ^admin/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/$ index.php?admin=1&class=$1&method=$2 [L,QSA]
RewriteRule ^(.*)/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)/$ index.php?class=$1&id=$2&method=$3 [L,QSA]
RewriteRule ^admin/([A-Za-z0-9-]+)/$ index.php?admin=1&class=$1 [L,QSA]
RewriteRule ^(.*)/([A-Za-z0-9-]+)/$ index.php?class=$1&method=$2 [L,QSA]
RewriteRule ^download/([A-Za-z0-9-]+.*) index.php?class=downloads&method=download&target=$1 [L,QSA]
RewriteRule ^stream/([A-Za-z0-9-+]+.*) index.php?class=downloads&method=download&target=$1 [L,QSA]
RewriteRule ^(.*)/$ index.php?class=$1 [L,QSA]

Есть ли причина, по которой они не работают в Linux?

РЕДАКТИРОВАТЬ:

Я запрашиваю URL-адрес http://domain.com/access поэтому я создал это правило RewriteRule access index.php?class=access который действительно работает.

По умолчанию apache имеет AllowOverride отключено, вам необходимо отредактировать конфигурацию apache в файле /etc/apache2/apache2.conf, чтобы включить

найти

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None

и изменить AllowOverride None к AllowOverride All

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

<Directory /path/to/virtualhost/site>
  AllowOverride All
</Directory>

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

a2enmod rewrite

Запрашиваемый URL-адрес http://example.com/access ...

Ни одно из опубликованных вами правил не соответствует такому запросу. Последнее правило требует косой черты в конце, поэтому http://example.com/access/ (с косой чертой в конце) должно работать нормально.

Чтобы сделать завершающую косую черту по желанию, вы можете изменить последнее правило на:

RewriteRule ^(.*)/?$ index.php?class=$1 [L,QSA]

Обратите внимание RewriteRule шаблон просто изменилось с ^(.*)/$ к ^(.*)/?$ - в ? делает предыдущий символ / группу необязательными. Если косая черта в конце не требуется, удалите ее.