I’m trying to redirect anyone surfing to http://forum.student.khleuven.be to http:// forum.kringraad.be. Both URL’s redirect to the same directory, basically. I tried the following using .htaccess:
Redirect permanent http://forum.student.khleuven.be/ http://forum.kringraad.be/
and also the following:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^forum.student.khleuven.be$ [NC]
RewriteRule ^(.*)$ http://forum.kringraad.be/$1 [R=301,L]
</IfModule>
Both give me a 500 Internal Server Error. I double checked that mod_rewrite is enabled, and it is. I’m pretty clueless, to be honest 🙂 Anyone know what to do?
asked Jun 30, 2010 at 18:32
David MDavid M
1971 gold badge2 silver badges6 bronze badges
3
Apparently the solution was this:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^forum.student.khleuven.be$ [NC]
RewriteRule ^(.*)$ http://forum.kringraad.be/$1 [R=301,L]
</IfModule>
I just had to remove the escapes. I don’t know why I don’t have to escape those dots, but it works perfectly like this.
answered Jun 30, 2010 at 19:11
David MDavid M
1971 gold badge2 silver badges6 bronze badges
Yes, there is a rewrite loop for every URI coming from a subdomain here that doesn’t map to a filename or directory.
For example if the client comes in with mail.indst.eu/nofile
- Hit subdomain rule mail.indst.eu for condition !^/mail -> rewrite to mail.indst.eu/mail/nofile
- No longer matches !^/mail, doesn’t hit any external redirect rules, so falls through towards the end.
- Doesn’t match the rewrite exclusion for existing files or one of the hardcoded exclusions
- Hits the non-host-bound all-uri rule, gets rewritten to mail.indst.eu/index.php
- Now it matches again the subdomain rule mail.indst.eu for condition !^/mail -> rewrite to mail.indst.eu/mail/index.php
- No longer matches !^/mail, doesn’t hit any external redirect rules, so falls through towards the end.
- Hits the non-host-bound all-uri rule, apparently mail/index.php is not an existing file, so /mail/index.php gets rewritten to /index.php, now we are in an alternating repeat between /index.php and /mail/index.php
/nofile
/mail/nofile (does not exist)
/index.php
/mail/index.php (does not exist)
/index.php
/mail/index.php (does not exist)
...repeat last two...
If you place an index.php in the subdirectories used by the subdomains, then a non-existing file uri on a subdomain will end up at the matching subdomain/index.php files, which for some applications may be what you want.
If you want a serverlevel 404 response, then you have to exclude the subdomain hosts from the catchall rewrite to index.php.
For example
RewriteCond %{HTTP_HOST} !^mail.indst.eu$
RewriteCond %{HTTP_HOST} !^www.statesanalytics.com$
RewriteRule ^.*$ index.php [NC,L]
OR, which might be more succint, and allow more subdomains:
RewriteCond %{REQUEST_URI} !^/mail
RewriteCond %{REQUEST_URI} !^/sa
RewriteRule ^.*$ index.php [NC,L]
Then a non existing uri at mail.indst.eu/starting-path is server level non existing if it doesn’t exist in mail/starting-path
There are other techniques to prevent such loops. If you know that there would always at most be one internal redirect for example, and all rewriterules reside in this one .htaccess then you can do this as first rewriterule in your .htaccess:
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteRule ^(.*)$ - [L]
That stops further internal redirects from this .htaccess. But it would require you to put the external redirect rules that you have before the internal redirect rules. It would not stop the RedirectMatch rules.
Or, if you know that a catchall rewrite to index.php should always be the last word the end mod_rewrite processing with [END]. But in this case that would mean a 404 on the subdomain ends up with the main directory index.php which may not be what you want.
RewriteRule ^.*$ index.php [END]
Redirect 301 keyboardchart.php keyboard-chart.php
The 500 error is because the target URL is relative. That is not allowed with a mod_alias Redirect. The target URL must either be absolute (with a scheme and hostname) or must start with a slash (ie. root-relative).
But also, the source URL-path will not match either. You must specify a root-relative URL-path, starting with a slash.
Regardless of where the .htaccess file is located, the mod_alias Redirect directive is the same. Unlike mod_rewrite (RewriteRule) that has the concept of a «directory-prefix».
So, like VladShundalov suggests, you would need a directive of the form:
Redirect 301 /keyboard/keyboardchart.php /keyboard/keyboard-chart.php
Note that this matches any query string. The query string is automatically passed through to the target. You can’t actually match the query string with a mod_alias Redirect.
If you need to match the specific query string then you must use mod_rewrite instead. For example, in the example.com/keyboard/.htaccess file you could write something like:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^gam=7&sty=15&lay=1$
RewriteRule ^keyboardchart.php$ /keyboard/keyboard-chart.php [R=301,L]
Note that you don’t state the subdirectory on the RewriteRule pattern in this case, however, you do still need a root-relative path on the substitution (unless you specify the path with a RewriteBase directive). The query string is passed through to the substitution automatically by default.
Отредактировано: 20 Ноября 2018
Файл .htaccess нужен для того чтобы иметь возможность переопределять базовые настройки web сервера Apache. Таких файлов на сайте может быть несколько. Каждый файл .htaccess распространяет свои правила на папки которые находятся на том же уровне в дереве ресурсов, или ниже, но не затрагивает каталоги в которых размещен другой файл .htaccess.
Стоит помнить, что обработка файлов .htaccess может быть запрещена в настройках веб-сервера, полностью или частично.
Не все операционные системы и программы позволяют создавать файл с точкой вначале, чтобы обойти это ограничение, можно создать обычный текстовый файл в notepad++ или другом доступном блокноте, и воспользоваться функцией «Сохранить как».
Синтаксис файлов .htaccess повторяет синтаксис главного файла конфигурации веб сервера, директивы так же аналогичны, только в сокращенном виде.
Комментарии в файле — символ # проставленный в начале строки
# Эта строка будет проигнорирована веб-сервером
Если после редактирования или размещения .htaccess при обращении к сайту вы получили ошибку 500, то, скорее всего, в файле .htaccess допущена ошибка. Посмотреть её причины можно в файле error_log вашего сервера.
Редиректы
Самая часто используемая функция .htaccess — Redirect. Эта директива сообщает браузеру о том, что по указанному адресу необходимо загрузить другую страницу, в простонародье — сделать редирект.
Простой редирект оформляют по схеме:
Redirect [статус] URL-путь-указанный-в-адресе URL-на-который-надо-переадресовать
Статус — необязательный параметр. Но часто он бывает важен для поисковых роботов. Возможные значения:
- 301 / permanent — документ перемещен постоянно
- 302 / temp — документ перемещен временно
- 303 / seeother — смотрите другой
- 410 / gone — убран
Подобный редирект не работает для адресов содержащих Query String (символы после ?). В таких случаях используют сочетание RewriteCond и RewriteRule.
- RewriteCond — определяет условие при котором происходит преобразование
- RewriteRule — правило для преобразования
Примеры редиректов
Перенаправить запросы со старого адреса страницы на новый
Redirect 301 /page.html http://www.domain.ru/new_page.html
Перенаправить все запросы к страницам сайта на аналогичные страницы другого сайта с использованием redirect
Redirect 301 / http://www.newdomain.ru/
Перенаправить все запросы к страницам сайта на аналогичные страницы другого сайта с использованием rewriteRule
RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.ru/$1 [R=301,L]
Перенаправить запросы на domain.ru с любого из синонимов сайта
RewriteEngine On
RewriteCond % !^domain.ru$ [NC]
RewriteRule ^(.*)$ http://domain.ru/$1 [L,R=301]
Перенаправить запросы на www.domain.ru с любого из синонимов сайта
RewriteEngine On
RewriteCond % !^www.domain.ru$ [NC]
RewriteRule ^(.*)$ http://www.domain.ru/$1[L,R=301]
Перенаправление всех запросов к странице /period/?test=123 на domain.ru
Options +FollowSymLinks
RewriteEngine On
RewriteCond % ^test=123$ [NC]
RewriteRule ^period/$ http://domain.ru/ [L,R=301]
Со страниц без слеша на страницы со слешем
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^.]+)(?<!/)$ /$1/ [R=301,L]
C http на https (актуален для timeweb)
RewriteCond %{HTTP:X-HTTPS} !1
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]
Переопределение страниц ошибок
#401 Авторизация не выполнена
ErrorDocument 401 /401.html
#403 Доступ запрещен
ErrorDocument 403 /403.html
#404 Страница не найдена
ErrorDocument 404 /404.html
#500 Внутренняя ошибка сервера
ErrorDocument 500 /500.html
Ограничение доступа к сайту по IP
Запретить доступ к сайту с IP-адресов 123.4.5.6 и 123.5.4.3
Order Allow,Deny
Allow from all
Deny from 123.4.5.6 123.5.4.3
Запретить доступ к сайту со всех адресов кроме 123.4.5.6 и 123.5.4.3:
Order Deny,Allow
Deny from all
Allow from 123.4.5.6 123.5.4.3
Запретить доступ к сайту для всех:
Deny from all
Запрет доступа к некоторым файлам
К файлам с расширением .cfg
<FilesMatch ".(cfg)$">
Order allow,deny
Deny from all
</FilesMatch>
Закрыть директорию паролем
AuthType Basic
AuthName "Some Name"
AuthUserFile /home/uXXXXX/.htpasswd
require valid-user
Путь /home/uXXXXX/.htpasswd обозначает полный путь к файлу паролей на диске сервера.
Файл с паролями должен содержать строки вида login:password. Пароль должен быть зашифрован с использованием алгоритма MD5. Один из способов создать такой файл — воспользоваться программой, входящей в поставку Apache — htpasswd
Переопределение главной страницы сайта (индексного файла каталога)
Сделать главной страницей файл menu.html:
DirectoryIndex menu.html
MIME типы файлов
Чтобы понять, какие документы надо показывать как html, какие как графику, а к каким надо выдать меню, позволяющее сохранить файл на диск, браузер использует MIME типы.
MIME типы описывается набором символов, отражающим тип используемых данных. Например, файлам с расширением .html соответствует тип text/html. В ответ на пришедший запрос html-файла сервер возвращает заголовок Content-type: text/html. Браузер, получив такой заголовок, знает, что документ с типом данных text/html это обычная веб-страница на языке HTML.
Все доступные MIME типы
Пример распространенных MIME типов данных
|
Описание данных |
Расширение файлов |
MIME type |
|
Картинки gif |
gif |
image/gif |
|
Картинки jpeg |
jpeg jpg jpe |
image/jpeg |
|
VRML-файлы |
wrl vrml |
model/vrml |
|
HTML-документ |
html htm |
text/html |
|
Обычный текст |
asc txt |
text/plain |
|
Архив ZIP |
zip |
application/zip |
|
Файл MS Word |
doc |
application/msword |
|
Файл MS Excel |
xls |
application/vnd.ms-excel |
|
Файл MS Power Point |
ppt |
application/vnd.ms-powerpoint |
|
Файл Adobe Acrobat |
|
application/pdf |
|
Flash-документ |
swf |
application/x-shockwave-flash |
Добавление MIME типов файлов
Периодически появляются новые MIME типы, которые не известны веб серверам, соответственно, в этом случае браузеры не смогут понять как обрабатывать указанный объект. Чтобы исправить эту проблему новые MIME типы надо добавить в настройках сервера или в файле .htaccess. Так же это пригодиться в случае если надо переопределить базовый MIME тип для уже известного расширения.
Файлы заканчивающиеся на / будут открываться как html:
AddType "text/html" /
Переопределение кодировки
AddType "text/html; charset=koi8-r" .html .htm .shtml
Назначить расширению действие
AddHandler
Отключить принудительную выдачу заголовка с кодировкой
При этом соответствующая кодировка должна быть прописана на каждой html-странице в виде тега
<http-equiv=»Content-type» content=»text/html; charset=windows-1251″ />
AddDefaultCharset Off
Включение обработки PHP в .html-файлах
RemoveHandler .html .htm
AddType application/x-httpd-php .php .htm .html .phtml
Выдача листинга каталога
Запрет выдачи листинга каталога
С настройками по умолчанию, Apache, в случае отсутствия в папке главной страницы (индексного файла), при обращении без указания конкретного имени файла в запросе выдаст список всех файлов, находящихся в каталоге. Для того чтобы запретить отображение листинга каталога, достаточно добавить в файл .htaccess строку:
Options -Indexes
Разрешение выдачи листинга каталога
Options +Indexes
# если возникла проблема с кодировкой, ее можно определить добавив
Charset=UTF-8
Включить выполнение CGI-скриптов в папке docs для файлов с расширениями .cgi, .pl. .py
В папке c CGI-скриптами необходимо разместить файл .htaccess с содержимым:
AddHandler cgi-script .cgi .pl .py
Options +ExecCGI
Скрипт должен иметь атрибут исполнения (+x, права доступа, начинающиеся с 7, например, 755).
Блокировка переходов со сторонних ресурсов
Для запрета перехода c baddomain.ru на domain.ru добавьте в .htaccess следующее:
RewriteEngine on
RewriteCond % baddomain.ru [NC]
RewriteRule .* - [F]
Если требуется запретить переходы с нескольких доменов, то используйте такие директивы
RewriteEngine on
RewriteCond % baddomain.ru [NC,OR]
RewriteCond % baddomain2.ru [NC,OR]
RewriteCond % baddomain3.ru [NC]
RewriteRule .* - [F]
Включение передачи заголовка Last-Modified для файлов .htm .html
Если не передается заголовок Last-Modified но по какой-либо причине он нужен, то включить его можно следующим параметром
RemoveHandler .html. .htm
Кириллические домены
(.РФ, .МОСКВА и др.)
В файле .htaccess использование кириллицы не допускается. При составлении правил перенаправления для кириллических доменов необходимо указывать имя домена в punycode. Узнать имя домена в punycode можно с помощью сервиса Whois.
Например, для перенаправления site.ru на caйт.рф нужно воспользоваться следующим правилом:
RewriteEngine on
RewriteCond % ^www.site.ru [NC]
RewriteRule ^(.*)$ http://xn--80aswg.xn--p1ai /$1 [R=301,L]
При этом посетители могут увидеть именно punycode-представление доменного имени в адресной строке браузера. Это не является ошибкой.
Полезные ссылки
Руководство по mod_rewrite
Модуль mod_alias
В статье мы расскажем, как исправить ошибку (код состояния) 500 со стороны пользователя и администратора сайта, а также подробно разберём, что такое ошибка запроса 500.
Что такое внутренняя ошибка сервера 500
Код ошибки 5хх говорит о том, что браузер отправил запрос корректно, но сервер не смог его обработать. Что значит ошибка 500? Это проблема сервера, причину которой он не может распознать.
Сообщение об ошибке сопровождается описанием. Самые популярные варианты:
- Внутренняя ошибка сервера 500,
- Ошибка 500 Internal Server Error,
- Временная ошибка (500),
- Внутренняя ошибка сервера,
- 500 ошибка сервера,
- Внутренняя ошибка HTTP 500,
- Произошла непредвиденная ошибка,
- Ошибка 500,
- HTTP status 500 internal server error (перевод ― HTTP статус 500 внутренняя ошибка сервера).
Дизайн и описание ошибки 500 может быть любым, так как каждый владелец сайта может создать свою версию страницы. Например, так выглядит страница с ошибкой на REG.RU:
Как ошибка 500 влияет на SEO-продвижение
Для продвижения сайта в поисковых системах используются поисковые роботы. Они сканируют страницы сайта, проверяя их доступность. Если страница работает корректно, роботы анализируют её содержимое. После этого формируются поисковые запросы, по которым можно найти ресурс в поиске.
Когда поисковый робот сканирует страницу с ошибкой 500, он не изменяет её статус в течение суток. В течение этого времени администратор может исправить ошибку. Если робот перейдёт на страницу и снова столкнётся с ошибкой, он исключит эту страницу из поисковой выдачи.
Проверить, осталась ли страница на прежних позициях, можно с помощью Google Search Console. Если робот исключил страницу из поисковой выдачи, её можно добавить снова.
Код ошибки 500: причины
Если сервер вернул ошибку 500, это могло случиться из-за настроек на web-хостинге или проблем с кодом сайта. Самые распространённые причины:
- ошибки в файле .htaccess,
- неподходящая версия PHP,
- некорректные права на файлы и каталоги,
- большое количество запущенных процессов,
- большие скрипты,
- несовместимые или устаревшие плагины.
Решить проблему с сервером можно только на стороне владельца веб-ресурса. Однако пользователь тоже может выполнить несколько действий, чтобы продолжить работу на сайте.
Что делать, если вы пользователь
Если на определённом ресурсе часто возникает ошибка 500, вы можете связаться с владельцем сайта по инструкции.
Перезагрузите страницу
Удаленный сервер возвращает ошибку не только из-за серьёзных проблем на сервере. Иногда 500 ошибка сервера может быть вызвана небольшими перегрузками сайта.
Чтобы устранить ошибку, перезагрузите страницу с помощью сочетания клавиш:
- на ПК — F5,
- на ноутбуке — Fn + F5,
- на устройствах от Apple — Cmd + R.
Обратите внимание! Если вы приобретаете товары в интернет-магазине и при оформлении заказа появляется 500 Internal Server Error (перевод — внутренняя ошибка сервера), при перезагрузке страницы может создаться несколько заказов. Поэтому сначала проверьте, оформился ли ваш предыдущий заказ. Если нет, попробуйте оформить заказ заново.
Очистите кэш и cookies браузера
Кэш и cookies сохраняют данные посещаемых сайтов и данные аутентификаций, чтобы в будущем загружать веб-ресурсы быстрее. Если на ресурсе уже был статус ошибки 500, при повторном входе на сайт может загружаться старая версия страницы с ошибкой из кэша, хотя на самом деле страница уже работает. Очистить кэш и куки браузера вам поможет инструкция.
Если ни одно из этих действий не решило проблему, значит, некорректно работает сам сервер сайта. Вернитесь на страницу позже, как только владелец решит проблему.
Что делать, если вы владелец сайта
В большинстве случаев устранить проблему может только владелец сайта. Как правило, ошибка связана с проблемами в коде. Реже проблемы могут быть на физическом сервере хостинг-провайдера.
Ниже рассмотрим самые популярные причины и способы решения.
Ошибки в файле .htaccess
Неверные правила в файле .htaccess — частая причина возникновения ошибки. Чтобы это проверить, найдите .htaccess в файлах сайта и переименуйте его (например, в test). Так директивы, прописанные в файле, не повлияют на работу сервера. Если сайт заработал, переименуйте файл обратно в .htaccess и найдите ошибку в директивах. Если вы самостоятельно вносили изменения в .htaccess, закомментируйте новые строки и проверьте доступность сайта.Также может помочь замена текущего файла .htaccess на стандартный в зависимости от CMS.
Найти директиву с ошибкой можно с помощью онлайн-тестировщика. Введите содержимое .htaccess и ссылку на сайт, начиная с https://. Затем нажмите Test:
Произошла непредвиденная ошибка
На экране появится отчёт. Если в .htaccess есть ошибки, они будут выделены красным цветом:
500 ошибка nginx
Активирована устаревшая версия PHP
Устаревшие версии PHP не получают обновления безопасности, работают медленнее и могут вызывать проблемы с плагинами и скриптами. Возможно, для работы вашего веб-ресурса нужна более новая версия PHP. Попробуйте сменить версию PHP на другую по инструкции.
Установлены некорректные права на файлы и каталоги сайта
В большинстве случаев корректными правами для каталогов являются «755», для файлов — «644». Проверьте, правильно ли они установлены, и при необходимости измените права на файлы и папки.
Запущено максимальное количество процессов
На тарифах виртуального хостинга REG.RU установлены ограничения на количество одновременно запущенных процессов. Например, на тарифах линейки «Эконом» установлено ограничение в 18 одновременно запущенных процессов, на тарифах «+Мощность» ― 48 процессов. Если лимит превышен, новый процесс не запускается и возникает системная ошибка 500.
Такое большое число одновременных процессов может складываться из CRON-заданий, частых подключений с помощью почтовых клиентов по протоколу IMAP, подключения по FTP или других процессов.
Чтобы проверить количество процессов, подключитесь по SSH. Выполните команду:
ps aux | grep [u]1234567 |wc -l
Вместо u1234567 укажите ваш логин хостинга: Как узнать логин хостинга.
Чтобы посмотреть, какие процессы запущены, введите команду:
Вместо u1234567 укажите логин услуги хостинга.
Командная строка отобразит запущенные процессы:
Код ошибки 500
Где:
- u1234567 — логин услуги хостинга,
- 40522 — PID процесса,
- S — приоритет процесса,
- /usr/libexec/sftp-server — название процесса.
Процесс можно завершить командой kill, например:
Вместо 40522 укажите PID процесса.
Чтобы решить проблему, вы также можете:
- увеличить интервал запуска заданий CRON,
- ограничить количество IMAP-соединений в настройках почтового клиента. Подробнее в статье Ограничение IMAP-соединений,
- проанализировать запущенные процессы самостоятельно или обратившись за помощью к разработчикам сайта.
Если вам не удалось самостоятельно устранить ошибку 500, обратитесь в техподдержку.
Скрипты работают слишком медленно
На каждом виртуальном хостинге есть ограничения на время выполнения скрипта. Если за установленное время скрипт не успевает выполниться, возникает ошибка сервера 500. Для решения проблемы обратитесь к разработчику сайта и оптимизируйте скрипты. Если оптимизировать нельзя, перейдите на более мощный вид сервера.
У пользователей VPS есть возможность увеличить максимальное использование оперативной памяти на процесс, но лучше делать скрипты меньшего размера.
Ошибка 500 на сайте, созданном на WordPress
WordPress предлагает много плагинов для создания хорошего сайта. Они значительно расширяют возможности CMS. Однако они же могут нарушать работу сайта и вызывать ошибку 500. Вызвать ошибку могут как недавно установленные плагины, так и старые.
Для начала проверьте, нужно ли обновить плагины. Часто устаревшие плагины перестают работать и вызывают проблемы работы сайта. Если все плагины обновлены, но 500 Internal Server Error остаётся, отключите все плагины, чтобы убедиться, что именно они мешают работе сайта. Как только станет понятно, что виноват один из плагинов, отключайте их по очереди, пока не найдёте тот, который нарушает работу сервера.
Как отключить плагин в WordPress
-
1.
-
2.
Перейдите во вкладку «Плагины» ― «Установленные».
-
3.
Нажмите Деактивировать у плагина, который, как вам кажется, повлиял на работу сайта:
Если все ваши действия не решили проблему или вы не уверены в своих технических знаниях, обратитесь к службе технической поддержки. Сообщите время обнаружения проблемы и опишите все действия, которые вы предприняли перед обращением. Специалисты сделают детальную проверку настроек вашего сайта и при необходимости обратятся к администраторам сервера на стороне хостинг-провайдера.