Задать вопрос

Mod_rewrite и хостингом?

Добрый день друзья.



Помогите кто чем может разобраться с хостером. Клиент предоставил хостинг, некий Alkar.net где судя по хелпам ничего не менялось с десять лет, еще успешно используют CGI и так далее.



Когда я начал заливать сайт, в котором есть .htaccess с некоторыми правилами все стало колом 500 ошибки, но я такое встречаю время от времени особенно на хостингах Франции и Бельгии, но стоит найти и закоментить некоторое правило или добавить какое то новое которое они рекомендуют и все работает. Но стал я пытаться отыскать в чем проблема в этот раз наткнулся на то что никогда не мешало.



Само правило очень простое:

RewriteRule ^(?!admin/|css/|images/|inc/|js/|m/|pma/)(.+)$ index.php [L,QSA]



То есть все что не начинается на admin/|css/|images/|inc/|js/|m/|pma — передается на index.php. Это правило работало уже 4 года и я его никогда нигде не трогал и трогать тут нечего, работает оно и на моем тестовом хостинге, но у этого провайдера все выпадает в 500. Ему не нравится "?!" то есть отрицание того что идет далее.



Друзья, подскажите как быть, на этом правиле все и работает, без него никуда.



Спасибо за ваши советы и время.
  • Вопрос задан
  • 3640 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
@DCa
Если еще интересует, то Apache версии до 2.0 не поддерживает PCRE, а поддерживает только регулярные выражения POSIX (http://httpd.apache.org/docs/2.0/new_features_2_0.html).
Отрицательное утверждение (?! это возможность PCRE, а не регулярных выражений POSIX, поэтому и не работает.
Ведь написал же апач, что не может скомпилить это регулярное выражение.
Замените вашу строку на эти и будет работать и на старом Apache (проверено):

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/admin/.*
RewriteCond %{REQUEST_URI} !^/css/.*
RewriteCond %{REQUEST_URI} !^/images/.*
RewriteCond %{REQUEST_URI} !^/inc/.*
RewriteCond %{REQUEST_URI} !^/js/.*
RewriteCond %{REQUEST_URI} !^/m/.*
RewriteCond %{REQUEST_URI} !^/pma/.*
RewriteRule ^(.*) /index.php [L,QSA]

Код для случая, если index.php находится в корне. Если нет — меняйте RewriteBase, путь к index.php и в каждом условии !^/вставьте_путь/admin/.*
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 6
ohmytribe
@ohmytribe
Есть возможность почитать логи?

Включен ли mod_rewrite? Если да, разрешены ли директивы RewriteRule?
Ответ написан
Комментировать
@DCa
Попробуйте исключить папки через директиву RewriteCond. В вашей директиве используется возможность регулярных выражений в формате PCRE, возможно дело в этом.

Можно заменить например так:

RewriteCond %{REQUEST_URI} !^/(admin/|css/|images/|inc/|js/|m/|pma/).*
RewriteRule ^(.*)$ index.php [L,QSA]
Ответ написан
Комментировать
@tarya Автор вопроса
RewriteRule работает, выше правила есть и mod_rewrite включен. Вообще вопрос снимается, хостер нам второй день выдавал пароль на MySQL что я сказал клиенту что пользоваться таким хостингом и мы уже проплатили нормальный.

Хотя конечно этот вопрос очень интересен, как то тут недавно была заметка на Хабре про .htaccess и я там оставлял сообщения что на разных хостингах разные директивы могут быть запрещены.
Ответ написан
Комментировать
@egorinsk
Ошибки надо смотреть в логах, а не пытаться угадать причину.
Ответ написан
Комментировать
@tarya Автор вопроса
Нашел доступ к логам, уже хочу разобраться для себя. Ошибка следующая:
RewriteRule: cannot compile regular expression '^(?!admin/|css/|images/|inc/|js/|m/|pma/)(.+)$'

Буду искать решение.
Ответ написан
Комментировать
@tarya Автор вопроса
Благодарю всех. Спасибо за помощь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы