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

Как я могу найти, что правило перезаписи в этом файле htaccess вызывает внутреннюю ошибку сервера?

У меня есть файл htaccess, который начинается так:

RewriteEngine On
RewriteBase /

RewriteCond %{QUERY_STRING}  where-can-i-find-information-about-homer-training
RewriteRule ^(.*)$  http://usersupport.homerenergy.com/customer/en/portal/articles/2186858-where-can-i-find-information-about-homer-training-?  [R=301,L]

RewriteCond %{QUERY_STRING}  is-homer-pro-conservative-in-its-predictions
RewriteRule ^(.*)$  http://usersupport.homerenergy.com/customer/en/portal/articles/2186859-is-homer-pro-conservative-in-its-predictions-?  [R=301,L]
...

который продолжается еще 308 аналогичных правил. Как видите, это предназначено для перенаправления списка статей с одного сайта на другой, где соответствующий элемент - это имя статьи в части запроса строки GET.

Если я просто добавлю одну или две пары RewriteCond/RewriteRules в файле, это работает. Но когда я использую весь файл, я получаю внутреннюю ошибку сервера 500.

Очевидно, одно из правил вызывает ошибку, но, просматривая файл, я не вижу, что это такое.

Посмотрев журнал ошибок, я вижу такое сообщение:

/var/www/html/.htaccess: RewriteCond: bad argument line '%{QUERY_STRING}'

что мне мало что говорит.

Как узнать, какое правило вызывает эту ошибку?

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

https://httpd.apache.org/docs/trunk/rewrite/remapping.html (раздел: Переписать строку запроса)

RewriteCond "%{QUERY_STRING}"  "where-can-i-find-information-about-homer-training"
RewriteRule "^(.*)$"  "http://usersupport.homerenergy.com/customer/en/portal/articles/2186858-where-can-i-find-information-about-homer-training-?" [R=301,L]

Думаю, у вас может быть пробел в одном из ваших значений. Попробуйте начать, может это исправить. Я обычно не использую "для перезаписи", но я также обычно не использую пробелы, ну, я имею в виду, я никогда не использую пробелы в этих типах имен.

В стороне,

^(.*)$ 

действительно не имеет смысла, потому что

(.*)

уже означает: все это. Я считаю, что начало и конец всего немного излишне.

Возможная альтернативная ошибка заключается в том, что вы просто пропустили разрыв строки в серии 500, вы можете дважды проверить это, используя представление номера строки в редакторе кода.