Я скопировал сайт со своей машины 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
шаблон просто изменилось с ^(.*)/$
к ^(.*)/?$
- в ?
делает предыдущий символ / группу необязательными. Если косая черта в конце не требуется, удалите ее.