Проблемы с сервером (в тестах при отправке — 404, cron и проверка обновлений — 500)
- ◄ Ошибка при принудительной смене пароля, MOODLE 3.1
- ssl moodle ►
Есть Windows Server 2008 R2 c MS SQL 10.00.2531, php 5.3.24, moodle 2.4.5+ (Build: 20130823), IIS
Устанавливал параметры в moodle:
extramemorylimit=1024MB
slash arguments выключен, так как появляется ошибка 404 при скачке файлов и не отображаются картинки
Есть проблемы, которые встречаются очень часто:
1) Сайт медленно работает при большом количестве пользователей
2) При прохождении модулей «Тест», бывает что не всегда их с первого раза открывает (пробовал и в новом окне с JS и в текущем), при отправке результатов довольно часто возникает ошибка 404. Приходиться перезагружать страницу с тестом либо заново авторизовываваться в другом браузере и пробовать повторно отправлять результаты.
3) Думал проапдейтить сервер и посмотреть cron, но при его выполнении страница долго грузиться и потом ошибка 500. При проверке обновлений таже ошибка 500. При удалении глобальной группы, также ошибка 500
Скачал логи IIS, PHP, MSSQL, перед этим включив отладку, пытаюсь найти ошибку, но все тщетно, не могу понять даже пока в какую сторону смотреть
в логах php по 2ому пункту нашел записи
[07-Dec-2015 10:55:30 Europe/Minsk] Database transaction aborted automatically in G:Moodle/mod/quiz/processattempt.php
[07-Dec-2015 10:55:30 Europe/Minsk] Default exception handler: Эта попытка уже была закончена. Debug:
Error code: attemptalreadyclosed
* line 101 of modquizprocessattempt.php: moodle_quiz_exception thrown
Вот еще часто встречается: [07-Dec-2015 08:30:59 Europe/Minsk] PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
[07-Dec-2015 08:34:38 Europe/Minsk] PHP Warning: PHP Startup: dbase: Unable to initialize module
И вот
[07-Dec-2015 09:09:11 Europe/Minsk] PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
[07-Dec-2015 09:09:11 Europe/Minsk] PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
[07-Dec-2015 09:09:11 Europe/Minsk] PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
[07-Dec-2015 09:09:11 Europe/Minsk] PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
[07-Dec-2015 09:09:11 Europe/Minsk] PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
[07-Dec-2015 09:09:58 Europe/Minsk] Default exception handler: Отсутствует обязательный параметр (attempt) Debug:
Error code: missingparam
* line 476 of libsetuplib.php: moodle_exception thrown
* line 527 of libmoodlelib.php: call to print_error()
* line 40 of modquizprocessattempt.php: call to required_param()
Извиняюсь тут за код, но проблема еще в том, что файл PHP_errors.log весит 500мб (с 2013 года на все сайты я так понял). Приму любую помощь и советы
Иду с этой же проблемой. Один-в-один. Отличия лишь только в том, что БД mysql (тип таблиц innodb) и moodle 2.6.1. Php 5.4.
Хотела переносить базу на mssql, но вижу, что не поможет. Перенесла пока только на отдельный сервер, копаюсь в настройках mysql server, потому что не знаю куда еще(
У меня есть предчувствие, что проблемы по пункту 2 из-за малого таймаута выполнения запроса, а по 3ему даже не знаю что и думать. Да, версия moodle не новая, т.к. php 5.3 только и ее поддерживает, но я и немогу обновиться в пределах этой версии
php 5.3.24
Обновить до 5.5/5.6, не смотря на то, что для moodle 2.4.5+ вроде хватает 5.3, но в нем нет opcache
PHP Warning: PHP Startup: dbase: Unable to initialize module
Закомментировать в php.ini строку extension=php_dbase.dll, это модуль не нужен. И вообще отключите все ненужные для moodle модули, кот не упоминаются на странице Среда (версии ПО)
PHP Deprecated: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0
Убрать в php.ini директиву magic_quotes_gpc, она с версии РНР 5.3 уже не используется и выключена.
slash arguments выключен, так как появляется ошибка 404 при скачке файлов и не отображаются картинки
Установить URL Rewrite и настроить как описано тут: https://docs.moodle.org/29/en/Internet_Information_Services#Slasharguments
Потом включить slasharguments на сайте. См. ещё это сообщение: https://moodle.org/mod/forum/discuss.php?d=276459#p1201745
часто возникает ошибка 404
страница долго грузиться и потом ошибка 500
Увеличить время выполнения скрипта max_execution_time, увеличить max_input_time
Увеличить в настройках IIS CGI timeouts. По умолчанию он установлен 5 мин, рекомендуют установить 1 час
Попробовать увеличить ограничение на длину запроса в IIS — maxRequestLength
Вот тут Не загружаются большие файлы scorm IIS мы же уже обсуждали настройки, попробуйте увеличить «Длина очереди»
Error code: относятся к ошибкам moodle из-за сервера
Спасибо, Вадим, буду пробовать. Включил подробную отладку для IIS, буду еще отслеживать после исправлений
Файл с логими php можете заархивировать, если вы его всё-равно не собираетесь весь читать.
Таймаут больше 5 минут устанавливать не стоит — для большинства штатных операций (типа отображение страницы теста) это не нужно, длительные операции вроде восстановления из бэкапа сами увеличивают время (если в настройках php это правильно разрешено). Если у вас больше минуты страница теста открывается, то пользователи будут беситься всё-равно, так что в любом случае нужно разбираться, что и как.
Если сайт и так тормозной, не обновляйтесь через веб-интерфейс, используйте утилиты командной строки. Через командную строку может неделю обновляться, но не вылетит. Обновитесь хотя бы до 2.7, там много оптимизаций сделано по кэшированию, сразу нагрузка должна будет уменьшиться. (только про бэкапы не забывайте)
Проверьте, не включен ли у вас режим дизайнера тем. При нем отключается кэширование css и во много раз возрастает нагрузка.
Выясните, сколько в среднем у вас работает cron. Так, если он запускатеся каждую минуту, а работает по 5 минут, то будет получаться, что у вас фоном работает 4 очень ресурсоемких процесса. А cron может тормозить, например, из-за того что php отправляет почту напрямую, а не через почтовый сервер. Это, конечно, не ваш случай, просто для примера.
Разберитесь в php — обновитесь до 5.5. В нём должно быть расширение opcache, тоже должна снизиться нагрузка. Нет возможности обновить php в связке с iis — поставьте рядом apache c php 5.5 на другом порту, а с iis сделайте проброску, установив application request routing.
После того, как обновите moodle, разберитесь, в чём же основная причина тормозов. Откройте монитор ресурсов, создайте нагрузку на сервер и посмотрите, что загружается под 100% — процессор, память или диск. А там, соответственно, каким из процессов — веб-сервером или базой данных.
Например, если у вас кончается память, то активно начинает использоваться подкачка, от этого возрастает нагрузка на диск, от этого существенно медленнее отдает информацию база данных, и всё тормозит.
Если у вас проблема с тем, что база данных создает большую нагрузку на жесткий диск (при тестировании такое вполне возможно), то такую проблему решать только комплексно — увеличивать память для бд, чтобы лучше кэшировала, (поможет если у вас не express edition), ставить специально под базу данных ssd диски или настраивать raid, выносить бд на отдельный сервер и т.п. Переход с одной БД на другую принципиальных преимуществ в этом случае, скорее всего, не даст.
Файл с логими php можете заархивировать, если вы его всё-равно не собираетесь весь читать.
Вот. Но там информация по всем сайтам сервера, с использованием php я так понял (но в принципе отследить можно по названиям файлов moodle php)
Таймаут больше 5 минут устанавливать не стоит - для большинства штатных операций (типа отображение страницы теста) это не нужно, длительные операции вроде восстановления из бэкапа сами увеличивают время (если в настройках php это правильно разрешено). Если у вас больше минуты страница теста открывается, то пользователи будут беситься всё-равно, так что в любом случае нужно разбираться, что и как.
Странно, в docs moodle там как раз и час советуют, на основном час ставил. Спасибо, посмотрю как будет с 5 минутами. А по поводу настроек php, какие параметры увеличивать надо? я по-моему только макс.загрузку файлов увеличивал (post_max_size и upload_max_filesize)
Если сайт и так тормозной, не обновляйтесь через веб-интерфейс, используйте утилиты командной строки. Через командную строку может неделю обновляться, но не вылетит. Обновитесь хотя бы до 2.7, там много оптимизаций сделано по кэшированию, сразу нагрузка должна будет уменьшиться. (только про бэкапы не забывайте)
Вот тут тяжелее, так как честно не знаю как обновлять moodle через ком.строку Windows Server, все время через web-интерфейс делал. Аж стыдно
Проверьте, не включен ли у вас режим дизайнера тем. При нем отключается кэширование css и во много раз возрастает нагрузка.
Отключен, кэширование js включено
Выясните, сколько в среднем у вас работает cron. Так, если он запускатеся каждую минуту, а работает по 5 минут, то будет получаться, что у вас фоном работает 4 очень ресурсоемких процесса. А cron может тормозить, например, из-за того что php отправляет почту напрямую, а не через почтовый сервер. Это, конечно, не ваш случай, просто для примера.
Cron уже писал запустить не могу, долго грузится, потом ошибка 500. Вся проблема в том, что мне этот сервер остался по наследству, скорей всего он там даже не настроен
Разберитесь в php - обновитесь до 5.5. В нём должно быть расширение opcache, тоже должна снизиться нагрузка.
Этим займусь в первую очередь
Например, если у вас кончается память, то активно начинает использоваться подкачка, от этого возрастает нагрузка на диск, от этого существенно медленнее отдает информацию база данных, и всё тормозит. Если у вас проблема с тем, что база данных создает большую нагрузку на жесткий диск (при тестировании такое вполне возможно), то такую проблему решать только комплексно - увеличивать память для бд, чтобы лучше кэшировала, (поможет если у вас не express edition), ставить специально под базу данных ssd диски или настраивать raid, выносить бд на отдельный сервер и т.п. Переход с одной БД на другую принципиальных преимуществ в этом случае, скорее всего, не даст.
Заметил на сервере только, что нагружается сильно процессор
Cron уже писал запустить не могу, долго грузится, потом ошибка 500. Вся
проблема в том, что мне этот сервер остался по наследству, скорей всего
он там даже не настроен
cron тоже правильнее запускать через командную строку. Если давно не запускали, возможно в первый запуск он будет работать ну очень долго (например рассылая по почте уведомления за последние годы)
Как тогда безболезненно (с наименьшей нагрузкой) это вылечить, можно ли запустить cron так, чтобы он обрабатывал данные за последний день, месяц, хотя бы?
Никак. Нужно просто запустить несколько раз и посмотреть, что он будет делать, чтобы хотя бы понять, что нужно оптимизировать
Ув. мудлеры, понимаю что не на тот форум пишу (перечитал статьи, faq, форумы, не помогло), но надеюсь на понимание.
Вот ситуация такая. Пробовал установить новую версию php 5.5 для этого сервера (Windows Server Enterprise SP2, IIS 7.0, MSSQL 2008), автоматом через web installer не получается:

Помню на другом сервере была та же проблема (windows server 2008 r2), на то время сетовал на несостыковку драйвера php для mssql (была старая версия драйвера поэтому там поставил mysql и через web installer все отлично встало и php и moodle. правда она сама поставила версию сначала 5.3, потом 5.5 и все работает до сих пор хорошо).
Далее попробовал вручную установить php 5.5, драйвера для ms sql 3.2 (readme почитал, драйвера скинул nts55), настроил php.ini, установил php manager для iis, подключил через Handler Mappings новую версию php, установил таймауты CGI и настройки FastCGI, затем через php manager, выбираю версию 5.5, пишет предупреждение о папке с расширениями, что надо заменить на 5.5 (extension_dir), и … PHP не работает!!!


Вручную установка PHP 5.5 на iis уже в который раз не удалась( Не знаю как сейчас быть. Сервер можно сказать «скинули» по наследству, и Apache поставить не дадут. Eще и несколько сайтов работает на PHP 5.3, а 5.5 не подхатывает.
Вернул пока все на место (php 5.3), настроил библиотеки там. Попробую потом настроить url rewriting и включить slash arguments, но c PHP вот такая беда. Ниже прикрепил настройки php.ini двух версий (5.3 работает, 5.5 нет)
- автоматом через web installer не получается — не использую, имхо, лишняя, абсолютно ненужная «приблуда». Проще установить и настроить руками. Инструкций в сети масса. Там всего-то дел — установить РНР в «любимую» директорию, назначить php-cgi.exe модулем для обработки *.php в диспетчере служб IIS и установить документ по умолчанию index.php
- несколько сайтов работает на PHP 5.3, а 5.5 не подхатывает — посмотрите на работающем сервере в phpinfo, откуда подгружается php.ini.

Для настройки нескольких версий РНР попробуйте использовать PHP Manager for IIS. Проще переключить обработчик для сайта в диспетчере служб IIS, чем переустанавливать РНР полностью.
Кроме того, иногда система ищет php.ini в %SystemRoot%, а не в каталоге установки РНР, тогда нужно создать переменную PHPRC, указав в ней путь к папке с php.ini. Вот тут почитайте:http://www.deepshiftlabs.com/dev_blog/?p=1880&lang=ru
ЗЫ: у меня почему-то работает без переменной PHPRC - По поводу ошибки установки РНР через web installer — попробуйте его кеш почистить
Как уже писал, PHP Manager стоит, страницу по умолчанию ставил, при переключении языка php, в настройках меняется и путь к нужному файлу конфигурации (там где установлен php 5.5, при смене на 5.3 автоматом меняет на нужный php.ini в папке с 5.3). Кеш установщика чистил, к сожалению не помогло
Поставьте отдельно apache на каком-нибудь другом порту типа 8080 и попробуйте на нём. Вариант про «не дадут» не очень понимаю — не обязательно его постоянно использовать, просто возможно с ним будет проще отладить запуск php и и нужных библиотек, чтобы потом перенести опыт на iis
Вадим, такая политика, Moodle администрировать отдали, а какие там проблемы никого не волнует, доступ к серверу выпросил, чтобы хотя бы php дали обновить, но и тут проблема. Хотел спросить по поводу запуска cron из командной строки, вроде все прописал (пытаюсь пока cron.php запустить на php5.3, путь указан верный), файл создался но пока пустой уже час. Может не то прописал? Или все так и должно быть?

В cron.log последней строчкой пока:
Starting processing the event queue...
и я так понял это на несколько часовдней?
Про 500 ошибку. А система у Вас скольки битная — 32, 64? Просто вот тут была похожая ошибка из-за того, что система 64х битная.
Спустя какое-то время снова задался этой проблемой. После долгих раздумий понял, что что-то упустил. Пересмотрев все еще раз, перелопатив форумы, начал проверять все досконально:
1)
1) Нужно установить Visual C++ 2012 Redistributable х86 и х64 тоже, спасибо Ella S
2) Упустил переменную PHPRC, поправил как тут http://www.deepshiftlabs.com/dev_blog/?p=1880&lang=ru и все заработало (включил opcache, расширения,драйвера mssql под php 5.5, подключил к moodle 2.4.5). Спасибо Вадим!
Стало все работать намного быстрее после перехода на php 5.5.30. Но теперь хотел бы запустить cron, чтобы после его отработки нормально обновиться (только вот не знаю как лучше, сразу на 2.7.13 или сначала на 2.4.х и потом на 2.7.13?). Но происходит ошибки при запуске из консоли, как ее можно победить?
Имхо, такие ошибки возникают от того, что в php.ini прописаны отсутствующие расширения.
Покажите вывод в консоли команды php -m. Ни на что не ругается? В логах рнр при запуске нет строк типа «Unable to load dynamic library…»?
C:Usersdisadmin>php -m
[PHP Modules]
bcmath
calendar
Core
ctype
curl
date
dom
ereg
filter
ftp
gd
gettext
gmp
hash
iconv
json
libxml
mbstring
mcrypt
mhash
mysql
mysqli
mysqlnd
odbc
openssl
pcre
PDO
Phar
Reflection
session
SimpleXML
soap
SPL
sqlsrv
standard
tokenizer
wddx
xml
xmlreader
xmlrpc
xmlwriter
zip
zlib
[Zend Modules]
C:Usersdisadmin
Но у нас еще 5.3 php версия стоит. может от туда подхватывает?
Покажите вывод в консоли команды php -m. Ни на что не ругается? В логах рнр при запуске нет строк типа «Unable to load dynamic library…»?
получается что нет, в логах такого ничего нету
php -v проверил, показывает версию 5.3(( Но для moodle 2.4 у нас же 5.5, и phpinfo срабатывает, на всякий случай логи в сообщении по php5.5 (почистил кеши, пытался запустить cron, что-то много ошибок появилось)
показывает версию 5.3
Наверное, эта версия прописалась в системные переменные. И ещё зависит от того, где команду php -v запускаете. Запустите в каталоге установки 5.5 — покажет 5.5
Модулей лишних много подключено, нужно оставить только необходимые для moodle. А вот opcache не подключен и в логах ошибка:
[21-Mar-2016 10:02:56 Europe/Minsk] PHP Warning: PHP Startup: Invalid library (appears to be a Zend Extension, try loading using zend_extension=php_opcache.dll from php.ini) in Unknown on line 0
Или путь к php_opcache.dll не находит, или версия .dll не подходит.
php -m должна показывать:
….
Zend OPcache
zip
zlib
[Zend Modules]
Zend OPcache
И ещё зависит от того, где команду php -v запускаете. Запустите в каталоге установки 5.5 — покажет 5.5
В каталоге php55 не могу запустить, т.к. появляются ошибки «Точка входа в процедуру … не найдена в библиотеке DLL php5.dll»
Решил скачать новый дистрибутив (думал может битый какой попался) все от туда же windows.php.net, запустить в нем php.exe, проблемы все те же
Удалось победить установку новой версии php 5.5 ручным способом (для тех, у кого не ставиться автоматом), может кому пригодится: для Windows Server следует изменить путь для переменной среды PHP непосредственно на уровне сервера, а не в IIS.
В итоге: moodle 2.4.5 оживился с новой версией php 5.5 и включенным opcache! На всякий случай убрал хранение логов в БД MS SQL Server. Сайт стал работать шустрее. НО! Т.к. cron не был настроен и сайт работал уже более 1.5 лет, не могу данный сценарий отработать снова(( Запускал и через веб-интерфейс, устанавливал больше тайм-ауты, запускал на несколько недель (2-3) из командной строки и записью логов в файл, в результате все стопорится в начале практически на enrol_cohorts и все!
Вопрос в следующем: что можно сделать? можно ли как-либо запустить данный сценарий другим способом? Можно ли обновить moodle в такой ситуации? Может сначала до последней редакции 2.4.х, а потом до 2.7.13 либо сразу до 2.7.13?
Вот тут еще есть полезный материал про ошибки php . Почитайте, возможно будет полезно. Вообще даже самый идеально написанный код зачастую содержит ошибки, и это нормально, если он функционирует без сбоев. Кстати, еще может помочь вариант с обновлением версии php
- ◄ Ошибка при принудительной смене пароля, MOODLE 3.1
- ssl moodle ►
ATTEMPT_.HLP проблемы часто являются результатом отсутствия, удаления или случайного перемещения файла из исходного места установки FreeBSD 2.2.1. Возникновение подобных проблем является раздражающим фактором, однако их легко устранить, заменив файл HLP, из-за которого возникает проблема. Мы также рекомендуем выполнить сканирование реестра, чтобы очистить все недействительные ссылки на ATTEMPT_.HLP, которые могут являться причиной ошибки.
Вы можете скачать новую копию файла ATTEMPT_.HLP для %%os%% (и ряда операционных систем Windows) в таблице ниже. В настоящее время в нашей безе отсутствуют некоторые файлы ATTEMPT_.HLP, однако вы можете получить их по запросу, нажав на кнопку Request (Запрос) рядом с соответствующей версией файла. В нашей обширной базе представлены не все версии файлов; в этом случае вам следует обратиться к Walnut Creek.
Правильное расположение файла ATTEMPT_.HLP является решающим фактором в успешном устранении ошибок подобного рода. Однако, не будет лишним выполнить быструю проверку. Повторно запустите FreeBSD 2.2.1, чтобы убедиться, что проблема успешно решена.
| ATTEMPT_.HLP Описание файла | |
|---|---|
| File: | HLP |
| Функция: | 2.2.1 |
| Софт: | FreeBSD 2.2.1 |
| Версия выпуска: | 1.0.0.0 |
| Автор: | Walnut Creek |
| Имя: | ATTEMPT_.HLP |
| Размер (в байтах): | 225 |
| SHA-1: | 76604C4DF67DEB8AFE95ED71CEFC338E2E4170D8 |
| MD5: | 6021B430DB4AEF83EFF9AD3EFE011B58 |
| CRC32: |
Продукт Solvusoft
Загрузка
WinThruster 2023 — Сканировать ваш компьютер на наличие ошибок реестра в ATTEMPT_.HLP
Windows
11/10/8/7/Vista/XP
Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление
HLP
ATTEMPT_.HLP
Идентификатор статьи: 1179757
ATTEMPT_.HLP
1
2
Выберите программное обеспечение
| Имя файла | ID | Байт | Загрузить | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + ATTEMPT_.HLP | 6021B430DB4AEF83EFF9AD3EFE011B58 | 225.00 B | ||||||||||||||||
|
Ошибки ATTEMPT_.HLP
Проблема FreeBSD 2.2.1, связанная с ATTEMPT_.HLP, включает в
- «Ошибка в файле ATTEMPT_.HLP.»
- «ATTEMPT_.HLP пропал без вести. «
- «Отсутствует файл ATTEMPT_.HLP.»
- «Не удалось загрузить ATTEMPT_.HLP.»
- «Не удалось зарегистрироваться: ATTEMPT_.HLP. «
- «Ошибка времени выполнения FreeBSD 2.2.1: ATTEMPT_.HLP»
- «ATTEMPT_.HLP не может загрузиться. «
Обычно ошибки синего экрана, связанные с ATTEMPT_.HLP, возникают при загрузке драйвера устройства, связанного с Walnut Creek, во время установки FreeBSD 2.2.1 или связанной программы или во время запуска или завершения работы Windows. Запись ошибок ATTEMPT_.HLP внутри FreeBSD 2.2.1 имеет решающее значение для обнаружения неисправностей электронной 2.2.1 и ретрансляции обратно в Walnut Creek для параметров ремонта.
Причины ошибок в файле ATTEMPT_.HLP
Проблемы FreeBSD 2.2.1 и ATTEMPT_.HLP возникают из отсутствующих или поврежденных файлов, недействительных записей реестра Windows и вредоносных инфекций.
В частности, проблемы ATTEMPT_.HLP, созданные:
- Запись ATTEMPT_.HLP повреждена или недопустима.
- Вирус или вредоносное ПО поврежден ATTEMPT_.HLP.
- Другая программа (не связанная с FreeBSD 2.2.1) удалила ATTEMPT_.HLP злонамеренно или по ошибке.
- Другая программа, конфликтующая с ATTEMPT_.HLP или другой общей ссылкой FreeBSD 2.2.1.
- Загрузите повреждение или неполную установку программы, связанной с ATTEMPT_.HLP.
I am thinking 412 (Precondition Failed) but there may be a better standard?
asked Jun 16, 2010 at 3:19
2
Status 422 seems most appropiate based on the spec.
The 422 (Unprocessable Entity) status code means the server
understands the content type of the request entity (hence a
415(Unsupported Media Type) status code is inappropriate), and the
syntax of the request entity is correct (thus a 400 (Bad Request)
status code is inappropriate) but was unable to process the contained
instructions. For example, this error condition may occur if an XML
request body contains well-formed (i.e., syntactically correct), but
semantically erroneous, XML instructions.
They state that malformed xml is an example of bad syntax (calling for a 400). A malformed query string seems analogous to this, so 400 doesn’t seem appropriate for a well-formed query-string which is missing a param.
Note: Since the above RFC is about WebDAV there can be a misunderstanding that 422 and some others are only to be used in the context of WebDAV and using them outside of it is «nonstandard». But this only means these status codes were introduced in the context of this RFC. Indeed the wording of these definitions is carefully chosen not to be specific to WebDAV.
David Ongaro
3,3301 gold badge23 silver badges35 bronze badges
answered Apr 25, 2012 at 20:14
![]()
KelvinKelvin
19.6k2 gold badges60 silver badges65 bronze badges
18
I’m not sure there’s a set standard, but I would have used 400 Bad Request, which the latest HTTP spec (from 2014) documents as follows:
6.5.1. 400 Bad Request
The 400 (Bad Request) status code indicates that the server cannot or
will not process the request due to something that is perceived to be
a client error (e.g., malformed request syntax, invalid request
message framing, or deceptive request routing).
answered Jun 16, 2010 at 3:32
Gert GrenanderGert Grenander
16.7k6 gold badges39 silver badges43 bronze badges
12
The WCF API in .NET handles missing parameters by returning an HTTP 404 «Endpoint Not Found» error, when using the webHttpBinding.
The 404 Not Found can make sense if you consider your web service method name together with its parameter signature. That is, if you expose a web service method LoginUser(string, string) and you request LoginUser(string), the latter is not found.
Basically this would mean that the web service method you are calling, together with the parameter signature you specified, cannot be found.
10.4.5 404 Not Found
The server has not found anything matching the Request-URI. No
indication is given of whether the condition is temporary or
permanent.
The 400 Bad Request, as Gert suggested, remains a valid response code, but I think it is normally used to indicate lower-level problems. It could easily be interpreted as a malformed HTTP request, maybe missing or invalid HTTP headers, or similar.
10.4.1 400 Bad Request
The request could not be understood by the server due to malformed
syntax. The client SHOULD NOT repeat the request without
modifications.
answered Jun 16, 2010 at 3:55
Daniel VassalloDaniel Vassallo
333k71 gold badges501 silver badges440 bronze badges
7
You can send a 400 Bad Request code. It’s one of the more general-purpose 4xx status codes, so you can use it to mean what you intend: the client is sending a request that’s missing information/parameters that your application requires in order to process it correctly.
answered Jun 16, 2010 at 3:32
BoltClockBoltClock
686k158 gold badges1372 silver badges1347 bronze badges
I Usually go for 422 (Unprocessable entity) if something in the required parameters didn’t match what the API endpoint required (like a too short password) but for a missing parameter i would go for 406 (Unacceptable).
answered Mar 6, 2014 at 9:32
![]()
Elad MeidarElad Meidar
7646 silver badges11 bronze badges
3
In one of our API project we decide to set a 409 Status to some request, when we can’t full fill it at 100% because of missing parameter.
HTTP Status Code «409 Conflict» was for us a good try because it’s definition
require to include enough information for the user to recognize the
source of the conflict.
Reference: w3.org/Protocols/
So among other response like 400 or 404 we chose 409 to enforce the need for looking over some notes in the request helpful to set up a new and right request.
Any way our case it was particular because we need to send out some data eve if the request was not completely correct, and we need to enforce the client to look at the message and understand what was wrong in the request.
In general if we have only some missing parameter we go for a 400 and an array of missing parameter. But when we need to send some more information, like a particular case message and we want to be more sure the client will take care of it we send a 409
answered Jan 8, 2015 at 14:06
![]()
gabrielemgabrielem
5605 silver badges13 bronze badges
3
For those interested, Spring MVC (3.x at least) returns a 400 in this case, which seems wrong to me.
I tested several Google URLs (accounts.google.com) and removed required parameters, and they generally return a 404 in this case.
I would copy Google.
answered May 19, 2012 at 21:01
RelefantRelefant
88310 silver badges10 bronze badges
5
It could be argued that a 404 Not Found should be used since the resource specified could not be found.
Luca
9,0035 gold badges45 silver badges59 bronze badges
answered Jan 17, 2012 at 14:44
3
I often use a 403 Forbidden error. The reasoning is that the request was understood, but I’m not going to do as asked (because things are wrong). The response entity explains what is wrong, so if the response is an HTML page, the error messages are in the page. If it’s a JSON or XML response, the error information is in there.
From rfc2616:
10.4.4 403 Forbidden
The server understood the request, but is refusing to fulfill it.
Authorization will not help and the request SHOULD NOT be repeated.
If the request method was not HEAD and the server wishes to make
public why the request has not been fulfilled, it SHOULD describe the
reason for the refusal in the entity. If the server does not wish to
make this information available to the client, the status code 404
(Not Found) can be used instead.
answered Feb 23, 2012 at 22:36
cdeszaqcdeszaq
30.5k25 gold badges115 silver badges173 bronze badges
5
Just go to the browser settings > Shields > Auto-redirect AMP pages
Disable it and try again …
answered Oct 18, 2022 at 21:18
I am thinking 412 (Precondition Failed) but there may be a better standard?
asked Jun 16, 2010 at 3:19
2
Status 422 seems most appropiate based on the spec.
The 422 (Unprocessable Entity) status code means the server
understands the content type of the request entity (hence a
415(Unsupported Media Type) status code is inappropriate), and the
syntax of the request entity is correct (thus a 400 (Bad Request)
status code is inappropriate) but was unable to process the contained
instructions. For example, this error condition may occur if an XML
request body contains well-formed (i.e., syntactically correct), but
semantically erroneous, XML instructions.
They state that malformed xml is an example of bad syntax (calling for a 400). A malformed query string seems analogous to this, so 400 doesn’t seem appropriate for a well-formed query-string which is missing a param.
Note: Since the above RFC is about WebDAV there can be a misunderstanding that 422 and some others are only to be used in the context of WebDAV and using them outside of it is «nonstandard». But this only means these status codes were introduced in the context of this RFC. Indeed the wording of these definitions is carefully chosen not to be specific to WebDAV.
David Ongaro
3,3301 gold badge23 silver badges35 bronze badges
answered Apr 25, 2012 at 20:14
![]()
KelvinKelvin
19.6k2 gold badges60 silver badges65 bronze badges
18
I’m not sure there’s a set standard, but I would have used 400 Bad Request, which the latest HTTP spec (from 2014) documents as follows:
6.5.1. 400 Bad Request
The 400 (Bad Request) status code indicates that the server cannot or
will not process the request due to something that is perceived to be
a client error (e.g., malformed request syntax, invalid request
message framing, or deceptive request routing).
answered Jun 16, 2010 at 3:32
Gert GrenanderGert Grenander
16.7k6 gold badges39 silver badges43 bronze badges
12
The WCF API in .NET handles missing parameters by returning an HTTP 404 «Endpoint Not Found» error, when using the webHttpBinding.
The 404 Not Found can make sense if you consider your web service method name together with its parameter signature. That is, if you expose a web service method LoginUser(string, string) and you request LoginUser(string), the latter is not found.
Basically this would mean that the web service method you are calling, together with the parameter signature you specified, cannot be found.
10.4.5 404 Not Found
The server has not found anything matching the Request-URI. No
indication is given of whether the condition is temporary or
permanent.
The 400 Bad Request, as Gert suggested, remains a valid response code, but I think it is normally used to indicate lower-level problems. It could easily be interpreted as a malformed HTTP request, maybe missing or invalid HTTP headers, or similar.
10.4.1 400 Bad Request
The request could not be understood by the server due to malformed
syntax. The client SHOULD NOT repeat the request without
modifications.
answered Jun 16, 2010 at 3:55
Daniel VassalloDaniel Vassallo
333k71 gold badges501 silver badges440 bronze badges
7
You can send a 400 Bad Request code. It’s one of the more general-purpose 4xx status codes, so you can use it to mean what you intend: the client is sending a request that’s missing information/parameters that your application requires in order to process it correctly.
answered Jun 16, 2010 at 3:32
BoltClockBoltClock
686k158 gold badges1372 silver badges1347 bronze badges
I Usually go for 422 (Unprocessable entity) if something in the required parameters didn’t match what the API endpoint required (like a too short password) but for a missing parameter i would go for 406 (Unacceptable).
answered Mar 6, 2014 at 9:32
![]()
Elad MeidarElad Meidar
7646 silver badges11 bronze badges
3
In one of our API project we decide to set a 409 Status to some request, when we can’t full fill it at 100% because of missing parameter.
HTTP Status Code «409 Conflict» was for us a good try because it’s definition
require to include enough information for the user to recognize the
source of the conflict.
Reference: w3.org/Protocols/
So among other response like 400 or 404 we chose 409 to enforce the need for looking over some notes in the request helpful to set up a new and right request.
Any way our case it was particular because we need to send out some data eve if the request was not completely correct, and we need to enforce the client to look at the message and understand what was wrong in the request.
In general if we have only some missing parameter we go for a 400 and an array of missing parameter. But when we need to send some more information, like a particular case message and we want to be more sure the client will take care of it we send a 409
answered Jan 8, 2015 at 14:06
![]()
gabrielemgabrielem
5605 silver badges13 bronze badges
3
For those interested, Spring MVC (3.x at least) returns a 400 in this case, which seems wrong to me.
I tested several Google URLs (accounts.google.com) and removed required parameters, and they generally return a 404 in this case.
I would copy Google.
answered May 19, 2012 at 21:01
RelefantRelefant
88310 silver badges10 bronze badges
5
It could be argued that a 404 Not Found should be used since the resource specified could not be found.
Luca
9,0035 gold badges45 silver badges59 bronze badges
answered Jan 17, 2012 at 14:44
3
I often use a 403 Forbidden error. The reasoning is that the request was understood, but I’m not going to do as asked (because things are wrong). The response entity explains what is wrong, so if the response is an HTML page, the error messages are in the page. If it’s a JSON or XML response, the error information is in there.
From rfc2616:
10.4.4 403 Forbidden
The server understood the request, but is refusing to fulfill it.
Authorization will not help and the request SHOULD NOT be repeated.
If the request method was not HEAD and the server wishes to make
public why the request has not been fulfilled, it SHOULD describe the
reason for the refusal in the entity. If the server does not wish to
make this information available to the client, the status code 404
(Not Found) can be used instead.
answered Feb 23, 2012 at 22:36
cdeszaqcdeszaq
30.5k25 gold badges115 silver badges173 bronze badges
5
Just go to the browser settings > Shields > Auto-redirect AMP pages
Disable it and try again …
answered Oct 18, 2022 at 21:18
Здравствуйте, я понимаю что ошибка возникла из-за путаницы переменных, хотя это мои предположения.. Дело в том, что данная ошибка возникла в обновлении и в просмотре: update и view. Я уже всё испробовала.. Ткните пожалуйста носом где я ошиблась?
Контроллер:
<?php
namespace appmodulesadmincontrollers;
use appmodulesadminmodelsFaqLang;
use Yii;
use appmodulesadminmodelsFaq;
use appmodulesadminmodelsFaqSearch;
use yiibaseModel;
use yiiwebController;
use yiiwebNotFoundHttpException;
use yiifiltersVerbFilter;
/**
* FaqsController implements the CRUD actions for Faq model.
*/
class FaqsController extends Controller
{
/**
* {@inheritdoc}
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['POST'],
],
],
];
}
/**
* Lists all Faq models.
* @return mixed
*/
public function actionIndex()
{
$searchModel = new FaqSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
/**
* Displays a single Faq model.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionView($id)
{
return $this->render('view', [
'faq' => $this->findModel($id),
]);
}
/**
* Creates a new Faq model.
* If creation is successful, the browser will be redirected to the 'view' page.
* @return mixed
*/
public function actionCreate()
{
$faq = new FaqLang;
$faqLang = new Faq;
if ($faq->load(Yii::$app->request->post()) && $faqLang->load(Yii::$app->request->post()) && Model::validateMultiple([$faq, $faqLang]))
{
$faqLang->save(false);
$faq->faq_id = $faq->id;
$faq->save(false);
return $this->redirect(['view', 'id' => $faq->id]);
}
return $this->render('create', [
'faqLang' => $faqLang,
'faq' => $faq,
]);
}
/**
* Updates an existing Faq model.
* If update is successful, the browser will be redirected to the 'view' page.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionUpdate($id)
{
$faq = FaqLang::findOne($id);
$faqLang = Faq::findOne($faq->faq_id);
if ($faq->load(Yii::$app->request->post()) && $faqLang->load(Yii::$app->request->post()) && Model::validateMultiple([$faq, $faqLang]))
{
$faqLang->save(false);
$faq->save(false);
return $this->redirect(['view', 'id' => $faq->id]);
}
return $this->render('update', [
'faq' => $faq,
'faqLang' => $faqLang,
]);
}
/**
* Deletes an existing Faq model.
* If deletion is successful, the browser will be redirected to the 'index' page.
* @param integer $id
* @return mixed
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionDelete($id)
{
$id_ = FaqLang::findOne($id)->faq_id;
Faq::findOne($id)->delete();
Faq::findOne($id_)->delete();
return $this->redirect(['index']);
}
/**
* Finds the Faq model based on its primary key value.
* If the model is not found, a 404 HTTP exception will be thrown.
* @param integer $id
* @return FaqLang
* @throws NotFoundHttpException if the model cannot be found
*/
protected function findModel($id)
{
if (($faq = FaqLang::findOne($id)) !== null) {
return $faq;
}
throw new NotFoundHttpException(Yii::t('app', 'The requested page does not exist.'));
}
}
index.php
<?php
use yiihelpersHtml;
use yiigridGridView;
/* @var $this yiiwebView */
/* @var $searchModel appmodulesadminmodelsFaqSearch */
/* @var $dataProvider yiidataActiveDataProvider */
$this->title = Yii::t('app', 'Faqs');
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="faq-index">
<h1><?= Html::encode($this->title) ?></h1>
<?php // echo $this->render('_search', ['model' => $searchModel]); ?>
<p>
<?= Html::a(Yii::t('app', 'Create Faq'), ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yiigridSerialColumn'],
['attribute' => 'name', 'value' => 'faqLang.name'],
['attribute' => 'body', 'value' => 'faqLang.body:ntext'],
'put_date',
['class' => 'yiigridActionColumn'],
],
]); ?>
</div>
view.php
<?php
use yiihelpersHtml;
use yiiwidgetsDetailView;
/* @var $this yiiwebView */
/* @var $faqLang appmodulesadminmodelsFaq */
/* @var $faq appmodulesadminmodelsFaqLang */
//$this->title = $faq->id;
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Faqs'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="faq-view">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?= Html::a(Yii::t('app', 'Update'), ['update', 'id' => $faq->id], ['class' => 'btn btn-primary']) ?>
<?= Html::a(Yii::t('app', 'Delete'), ['delete', 'id' => $faq->id], [
'class' => 'btn btn-danger',
'data' => [
'confirm' => Yii::t('app', 'Are you sure you want to delete this item?'),
'method' => 'post',
],
]) ?>
</p>
<?= DetailView::widget([
'faq' => $faq,
'attributes' => [
'id',
['attribute' => 'name', 'value' => 'faqLang.name'],
['attribute' => 'body', 'value' => 'faqLang.body:ntext'],
'put_date',
[
'attribute' => 'hide',
'format' => 'html',
'value' => function($model) {
if($model->hide == 'show')
return 'Нет';
else
return 'Да';
}
],
],
]) ?>
</div>
update.php
<?php
use yiihelpersHtml;
/* @var $this yiiwebView */
/* @var $faqLang appmodulesadminmodelsFaq */
/* @var $faq appmodulesadminmodelsFaqLang */
$this->title = Yii::t('app', 'Update Faq: ' . $faq->id, [
'nameAttribute' => '' . $faq->id,
]);
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Faqs'), 'url' => ['index']];
$this->params['breadcrumbs'][] = ['label' => $faq->id, 'url' => ['view', 'id' => $faq->id]];
$this->params['breadcrumbs'][] = Yii::t('app', 'Update');
?>
<div class="faq-update">
<h1><?= Html::encode($this->title) ?></h1>
<?= $this->render('_form', [
'faq' => $faq,
'faqLang' => $faqLang,
]) ?>
</div>
create.php
<?php
use yiihelpersHtml;
/* @var $this yiiwebView */
/* @var $faqLang appmodulesadminmodelsFaq */
/* @var $faq appmodulesadminmodelsFaqLang */
$this->title = Yii::t('app', 'Create Faq');
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'Faqs'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="faq-create">
<h1><?= Html::encode($this->title) ?></h1>
<?= $this->render('_form', [
'faq' => $faq,
'faqLang' => $faqLang,
]) ?>
</div>
form.php
<?php
use yiihelpersHtml;
use yiiwidgetsActiveForm;
use yiijuiDatePicker;
use mihaildevckeditorCKEditor;
/* @var $this yiiwebView */
/* @var $faqLang appmodulesadminmodelsFaq */
/* @var $faq appmodulesadminmodelsFaqLang */
/* @var $form yiiwidgetsActiveForm */
?>
<div class="faq-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($faq, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($faq, 'body')->widget(CKEditor::className(),[
'editorOptions' => [
'preset' => 'full', //разработанны стандартные настройки basic, standard, full данную возможность не обязательно использовать
'inline' => false, //по умолчанию false
],
]); ?>
<?= $form->field($faqLang, 'put_date')->widget(DatePicker::class, [
'language' => 'ru-RU',
'dateFormat' => 'yyyy-MM-dd',
]) ?>
<?= $form->field($faqLang, 'hide')->dropDownList([ 'show' => 'Отображать', 'hide' => 'Скрыто']) ?>
<div class="form-group" style="margin-top: 46px;">
<?= Html::submitButton($faqLang->isNewRecord ? 'Создать' : 'Редактировать', ['class' => $faqLang->isNewRecord ? 'btn btn-success' : 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Я получаю эту ошибку. Обязательный параметр «тег» отсутствует в тостере android, пожалуйста, помогите, я не могу найти свою ошибку ниже. У меня есть код пользователя Android и код сервера php выше. Я использую библиотеку volley для httprequests.
StringRequest strReq = new StringRequest(Request.Method.POST,
AppConfig.URL_REGISTER, new Response.Listener() {
@Override
public void onResponse(String response) {
Log.d(TAG, «Register Response: » + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean(«error»);
if (!error) {
// User successfully stored in MySQL
// Now store the user in sqlite
String uid = jObj.getString(«uid»);
JSONObject user = jObj.getJSONObject(«user»);
String name = user.getString(«name»);
String email = user.getString(«email»);
String created_at = user
.getString(«created_at»);
// Inserting row in users table
db.addUser(name, email, uid, created_at);
// Launch login activity
Intent intent = new Intent(RegisterActivity.this,
LoginActivity.class);
startActivity(intent);
finish();
} else {
// Error occurred in registration. Get the error
// message
String errorMsg = jObj.getString(«error_msg»);
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, «Registration Error: » + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
})
{
@Override
protected Map getParams() {
// Posting params to register url
Map params = new HashMap();
params.put(«tag», «register»);
params.put(«name», name);
params.put(«email», email);
params.put(«password», password);
return params;
}
@Override
public Map getHeaders() throws AuthFailureError {
HashMap headers = new HashMap();
headers.put(«Content-Type», «application/json; charset=utf-8»);
return headers;
}
};
// Adding request to request queue
AppController.getInstance().addToRequestQueue(strReq, tag_string_req);
AppcontrollerClass здесь
Public class AppController extends Application {
public static final String TAG = AppController.class.getSimpleName();
private RequestQueue mRequestQueue;
private static AppController mInstance;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized AppController getInstance() {
return mInstance;
}
public RequestQueue getRequestQueue() {
if (mRequestQueue == null) {
mRequestQueue = Volley.newRequestQueue(getApplicationContext());
}
return mRequestQueue;
}
public req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG: tag);
getRequestQueue().add(req);
}
public void addToRequestQueue(Request req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (mRequestQueue != null) {
mRequestQueue.cancelAll(tag);
}
}
}
это журнал андроидов
08-07 14:35:36.552 19120-20088/com.example.panos.chatsmartapp D/Volley﹕ BasicNetwork.logSlowRequests: HTTP response for request=< http://192.168.1.3/android_login_api/ 0x355f917 NORMAL 1> , , ,
08-07 14:35:36.662 19120-19120/com.example.panos.chatsmartapp D/RegisterActivity﹕ Register Response: {«error»:true,»error_msg»:»Required parameter «tag» is missing!»}
08-07 14:35:36.702 19120-19120/com.example.panos.chatsmartapp D/Toast﹕ checkMirrorLinkEnabled returns: false
08-07 14:35:36.702 19120-19120/com.example.panos.chatsmartapp D/Toast﹕ showing allowed
08-07 14:35:36.702 19120-19120/com.example.panos.chatsmartapp D/Volley﹕ Request.finish: 4253 ms: http://192.168.1.3/android_login_api/ 0x355f917 NORMAL 1
08-07 14:35:36.712 19120-19120/com.example.panos.chatsmartapp E/ViewRootImpl﹕ sendUserActionEvent() mView == null
это php-код
$tag, «error» => FALSE);
// check for tag type
if ($tag == «login») {
// Request type is check Login
$email = $_POST[«email»];
$password = $_POST[«password»];
// check for user
$user = $db->getUserByEmailAndPassword($email, $password);
if ($user != false) {
// user found
$response[«error»] = FALSE;
$response[«uid»] = $user[«unique_id»];
$response[«user»][«name»] = $user[«name»];
$response[«user»][«email»] = $user[«email»];
$response[«user»][«created_at»] = $user[«created_at»];
$response[«user»][«updated_at»] = $user[«updated_at»];
echo json_encode($response);
} else {
// user not found
// echo json with error = 1
$response[«error»] = TRUE;
$response[«error_msg»] = «Incorrect email or password!»;
echo json_encode($response);
}
} else if ($tag == «register») {
// Request type is Register new user
$name = $_POST[«name»];
$email = $_POST[«email»];
$password = $_POST[«password»];
// check if user is already existed
if ($db->isUserExisted($email)) {
// user is already existed — error response
$response[«error»] = TRUE;
$response[«error_msg»] = «User already existed»;
echo json_encode($response);
} else {
// store user
$user = $db->storeUser($name, $email, $password);
if ($user) {
// user stored successfully
$response[«error»] = FALSE;
$response[«uid»] = $user[«unique_id»];
$response[«user»][«name»] = $user[«name»];
$response[«user»][«email»] = $user[«email»];
$response[«user»][«created_at»] = $user[«created_at»];
$response[«user»][«updated_at»] = $user[«updated_at»];
echo json_encode($response);
} else {
// user failed to store
$response[«error»] = TRUE;
$response[«error_msg»] = «Error occured in Registartion»;
echo json_encode($response);
}
}
} else {
// user failed to store
$response[«error»] = TRUE;
$response[«error_msg»] = «Unknow «tag» value. It should be either «login» or «register»»;
echo json_encode($response);
}
}
else {
$response[«error»] = TRUE;
$response[«error_msg»] = «Required parameter «tag» is missing!»;
echo json_encode($response);
}
?>
Myabe У меня проблема с utf8 string, используя json_encode/json_decode. Я не знаю…
Однажды заглянул я в лог /var/log/messages
на сервере под управлением FreeBSD. Лог оказался практически полностью оказался забитым следующими записями:
kernel: Connection attempt to UDP 127.0.0.1:10441 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10441 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10445 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10445 from 127.0.0.1:53
kernel: Connection attempt to UDP 192.0.32.10:6881 from 188.85.194.61:24333
kernel: Connection attempt to UDP 127.0.0.1:10468 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10468 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10469 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10469 from 127.0.0.1:53
kernel: Connection attempt to UDP 127.0.0.1:10470 from 127.0.0.1:53
Что бы это значило?
Яндекс навёл на топик «Непонятное поведение bind»
Там на мой вопрос уже ответили:
Connection attempt to UDP 127.0.0.1:10445 from 127.0.0.1:53
Это строка переводится как:
С сокета 127.0.0.1:53 попробовали послать зарос по UPD
на сокет 127.0.0.1:10445, но порт 10445 адреса 127.0.0.1 никто не прослушивает.
Соединение не состоялось.
Посмотрим кто у нас висит на на 53 порту?
Порт привилегированный (<1024) значит там должно быть что-то распространённое.
# grep -w 53 /etc/services
domain 53/tcp #Domain Name Server
domain 53/udp #Domain Name Server
А, это же порт DNS сервера. Кто на нём висит на самом деле?
# sockstat -l | grep -w 53
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
bind named 19021 514 udp4 127.0.0.1:53 *:*
Это DNS сервер BIND.
Зачем же он хочет соединиться с несуществующим сокетом? В том же топике приведен правильный ответ:
Некая программа посылает BIND запрос на разрешение доменного имени. BIND отвечает так долго, что запросившая програма перестаёт ждать ответ. bind наконец-то посылает ответ, но его уже никто не ждёт. Ядро регистрирует неудачное соединение.
Что за программа делает так много долгих dns запросов?
Почему она не дожидается ответа?
Программа нашлась быстро
# sockstat | grep -w 53
nobody spamilter 9801 11 udp4 127.0.0.1:60037 127.0.0.1:53
nobody spamilter 9801 12 udp4 127.0.0.1:60038 127.0.0.1:53
С DNS на одной машине работает почтовый сервер Sendmail с аниспамовымиантивирусными фильтрами.
spamilter — как раз антиспам-фильтр.
Электронная почта (особенно с современными наворотами типа DKIM) тесно завязана на DNS.
Поэтому я не удивился, такой активности.
В логах sendmail быстро нашёлся пример долгого dns запроса — попытка разрещить адрес rcom-ne.com
# dig +trace rcom-ne.com
; <<>> DiG <<>> +trace rcom-ne.com
;; global options: printcmd
. 172099 IN NS j.root-servers.net.
. 172099 IN NS k.root-servers.net.
. 172099 IN NS l.root-servers.net.
. 172099 IN NS m.root-servers.net.
. 172099 IN NS a.root-servers.net.
. 172099 IN NS b.root-servers.net.
. 172099 IN NS c.root-servers.net.
. 172099 IN NS d.root-servers.net.
. 172099 IN NS e.root-servers.net.
. 172099 IN NS f.root-servers.net.
. 172099 IN NS g.root-servers.net.
. 172099 IN NS h.root-servers.net.
. 172099 IN NS i.root-servers.net.
;; Received 244 bytes from 127.0.0.1#53(127.0.0.1) in 0 ms
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
;; Received 501 bytes from 192.58.128.30#53(j.root-servers.net) in 52 ms
rcom-ne.com. 172800 IN NS ns1.rcom-ne.com.
rcom-ne.com. 172800 IN NS ns2.rcom-ne.com.
;; Received 97 bytes from 192.52.178.30#53(k.gtld-servers.net) in 55 ms
;; connection timed out; no servers could be reached
Запрос отваливается по таймауту.
Чёртовы спаммеры, понапишут адресов, а ты их проверяй.
Итак. Ничего страшного не происходит. Но надо очистить лог от этих сообщений, а то они забивают действительно важную информацию.
Лечим симптомы
Радикальный способ — вообще отключить проколирование неудачных соединений.
Через sysctl:
# sysctl -d net.inet.tcp.log_in_vain net.inet.udp.log_in_vain
net.inet.tcp.log_in_vain: Log all incoming TCP connections
net.inet.udp.log_in_vain: Log all incoming UDP packets
# sysctl net.inet.udp.log_in_vain=0
net.inet.udp.log_in_vain: 1 -> 0
Но тут с водой мы выплёскиваем ребёнка. Я хочу знать, кто ломится ко мне на закрытые порты.
Попробовать прикрутить к syslog»у фильтр — сложно, повышается вероятность отказа системы протоколирования, да и просто некрасиво.
Может можно отключить протоколирование для loopback интерфейса, он особого интереса на представляет?
В гугле не нашёл такого, посмотрим в исходниках.
# fgrep -rIn «Connection attempt to UDP» /usr/src/
/usr/src/sys/netinet/udp_usrreq.c:406: «Connection attempt to UDP %s:%d from %s:%dn»,
/usr/src/sys/netinet6/udp6_usrreq.c:341: «Connection attempt to UDP [%s]:%d from [%s]:%dn»,
# less +718 /usr/src/sys/netinet/tcp_input.c
switch (log_in_vain) {
case 1:
if ((thflags & TH_SYN) == 0)
break;
/* FALLTHROUGH */
case 2:
log(LOG_INFO,
«Connection attempt to TCP %s:%d »
«from %s:%d flags:0x%02xn»,
dbuf, ntohs(th->th_dport), sbuf,
ntohs(th->th_sport), thflags);
break;
default:
break;
}
Похоже, рубильник только один и на все интерфейсы сразу — log_in_vain.
Симптомы устранить не получается, давайте лечит болезнь.
Изучаем resolver
Сообщение возникает, когда программа не дожидается ответа от DNS.
Надо чтобы либо DNS отвечал быстрее, либо программа ждала дольше.
Как заставить программу ждать дольше?
Для запросов к dns используются функции libc — res_query, res_search, res_mkquery, res_send…
Другие функции типа gethostbyname являются более высокоуровненвыми и в конечном счёте используют именно эти «примитивы».
Поведение функций res_query определяется файлом /etc/resolv.conf (имя и путь этого файла жёстко прописаны в исходниках).
У нас есть два параметра timeout
и attempts.
timeout
— время ожидания ответа от dns сервера.
attempts
— количество повторных запросов к dns серверу, если на первый запрос не ответили.
Сразу после окончания ожидания первого запроса посылается второй запрос и т.д.
Пример resolv.conf
Nameserver 8.8.8.8
nameserver 8.8.4.4
options timeout:7 attempts:1
Значения по умолчанию, и предельные значения можно посмотреть в /usr/include/resolv.h
/*
* Global defines and variables for resolver stub.
*/
……
#define RES_TIMEOUT 5 /* min. seconds between retries */
#define RES_MAXRETRANS 30 /* only for resolv.conf/RES_OPTIONS */
#define RES_MAXRETRY 5 /* only for resolv.conf/RES_OPTIONS */
#define RES_DFLRETRY 2 /* Default #/tries. */
#define RES_MAXTIME 65535 /* Infinity, in milliseconds. */
…..
По умолчанию у нас 5 секунд ожидания и 2 повторных попытки. Это для каждого сервера, к которому мы пытаемся обратиться.
Для примера выше, максимальное время ожидания ответа (если отвалятся оба dns-сервера)
2 (сервера) x 7 (таймаут) x (1+1 (попыток)) = 28 секунд.
У меня конфиг был попроще
# cat /etc/resolv.conf
domain myserver
nameserver 127.0.0.1
Получалось 1x3x5 = 15. Проверим.
Самая простая утилита — host использует свои встроенные настройки, поэтому возьмём продвинутую dig.
# time dig rcom-ne.com
; <<>> DiG <<>> rcom-ne.com
;; global options: printcmd
;; connection timed out; no servers could be reached
real 0m15.009s
user 0m0.000s
sys 0m0.006s
Проверим нашу гипотезу о причине возникновения сообщения в логе.
В одной консоли запустим
# (date;time dig rcom-ne.com;date) &
пятница, 11 февраля 2011 г. 16:46:49 (MSK)
; <<>> DiG <<>> rcom-ne.com
;; global options: printcmd
;; connection timed out; no servers could be reached
real 0m15.009s
user 0m0.000s
sys 0m0.006s
пятница, 11 февраля 2011 г. 16:47:04 (MSK)
А в другой, пареллельно посмотрим, какой порт использует dig
# sockstat | grep dig
root dig 71322 20 udp4 *:52170 *:*
# grep 52170 /var/log/messages
Mar 4 16:47:20 myserver kernel: Connection attempt to UDP 127.0.0.1:52170 from 127.0.0.1:53
15 секунд dig ждёт ответа, а ответ приходит через (16:47:20 — 16:46:49 = 31 ~ 30) 30 секунд.
Теперь увеличим время ожидания ответа до 30 секунд или даже больше.
Time для dig — это timeout из resolv.conf
# date; time dig +time=12 rcom-ne.com;date
пятница, 4 марта 2011 г. 17:07:46 (MSK)
; <<>> DiG <<>> +time=12 rcom-ne.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 61974
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;rcom-ne.com. IN A
;; Query time: 5998 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Feb 11 17:08:16 2011
;; MSG SIZE rcvd: 29
real 0m30.006s
user 0m0.005s
sys 0m0.000s
пятница, 11 февраля 2011 г. 17:08:16 (MSK)
dig получил ответ за 30 секунд
, хотя ждать мог целых 1x3x12=36.
Видимо, 30 секунд это таймаут самого BIND.
Запомним это.
status: SERVFAIL
означает, что dns сервер не смог обработать запрос из-за проблем с dns-сервером (RFC 1035 , RFC 2929).
«Ну не шмогла, я не шмогла» — говорит нам сервер, хотя мы-то знаем, что он просто не дождался ответа от dns серверов домена rcom-ne.com.
Персональный подход
Параметры в resolv.conf действуют на все программы.
Увеличивать максимальное время запроса с 15 до 30 секунд (в 2 раза) для всех программ на сервере не хочется.
Может можно подправить таймауты резольвера для отдельных программ?
смотрите confTO_RESOLVER_RETRANS и confTO_RESOLVER_RETRY.
Но нам нужно настроить в первую очередь spamilter. А у него таких настроек нету. Правка resolv.conf на него тоже как будто не действовала.
Я пробовал править исходники — но результата добиться не смог.
Примечание:
Уже после решения проблемы, экспериментируя с resolv.conf и tcpdump я выяснил, что resolv.conf
конечно влиял на spamilter. Только он периодически посылал 2 запроса одновременно, вместо того, чтобы послать их через timeout секунд.
Видимо это глюк многопоточной архитектуры spamilter, хотя сам resolver в man описан как thread-safe.
Заветные 30 секунд
Пришлось задуматься над тем, как поправить время ответа BIND.
Подобный вопрос я находил в интернете, но без ответа.
Расстроенный я поискал в исходниках заветную цифру 30 и мне повезло.
История изменений сообщила мне:
/usr/src/contrib/bind9/CHANGES
…………………
— 9.2.3rc1 released —
…………………
1122. Resolution timeout reduced from 90 to 30 seconds.
…………………
— 9.2.2 released —
…………………
По описанию похоже на то, что я искал.
Я скачал обе упомянутые версии BIND, сделал diff и долго в него всматривался пока не нашёл.
-/* $Id: resolver.c,v 1.218.2.12.4.4 2003/02/18 03:32:01 marka Exp $ */
+/* $Id: resolver.c,v 1.218.2.18 2003/07/18 04:35:51 marka Exp $ */
@@ -2234,7 +2229,7 @@
/*
* Compute an expiration time for the entire fetch.
*/
— isc_interval_set(&interval, 90, 0); /* XXXRTH constant */
+ isc_interval_set(&interval, 30, 0); /* XXXRTH constant */
iresult = isc_time_nowplusinterval(&fctx->expires, &interval);
if (iresult != ISC_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__,
Я попробовал уменьшить параметр функции isc_interval_set до и ура — ответы от BIND стали приходить максимум через 20 секунд.
# ee /usr/src/contrib/bind9/lib/dns/resolver.c
# cd /usr/src/lib/bind
# make obj && make depend && make && make install
# cd /usr/src/usr.sbin/named
# make obj && make depend && make && make install
# /etc/rc.d/named restart
Но на продакшене я не стал ничего править, кто знает какие проблемы это может вызвать. Не зря же разработчики так жестко уставили этот параметр.
Всё сначала
Итак, потратив кучу времени я так и не смог решить проблему.
Наконец, я решил посмотреть какими конкретно запросам spamilter бомбардирует DNS, какие именно адреса долго разрешает BIND?
Tcpdump -i lo0 -s 0 -w dns.pcap «udp port 53»
Откроем dns.pcap
в Wireshark и посмотрим неудачные запросы.
Оказалось, что в своих предположениях я был очень далёк от истины.
90% безответных запросов были к доменам list.dsbl.org multihop.dsbl.org unconfirmed.dsbl.org
Standard query A 146.152.225.99.list.dsbl.org
Через DNS запросы spamilter пробивал адресы почтовых серверов по базам спаммеров.
Это технология DNSBL.
Я пошёл на dsbl.org и обнаружил, что он давным-давно уже не работает.
Поискав по конфигам я нашёл эти адреса в файле /var/db/spamilter/db.rdnsbl и закоментировал их.
#relays.ordb.org |http://www.ordb.org |Reject |Rcpt
#list.dsbl.org |http://www.dsbl.org |Reject |Rcpt
#multihop.dsbl.org |http://www.dsbl.org |Reject |Rcpt
#unconfirmed.dsbl.org |http://www.dsbl.org |Reject |Rcpt
Лавина неудачных запросов исчезла. Проблема решилась.
Учиться на ошибках
С одной стороны, я сильно лопухнулся, когда вместо того, чтобы тщательно провести расследование проблемы, посмотреть различные логи, поанализировать траффик, я сразу сделал предположения и на их основе стал искать решения. В результате потратил кучу времени и проделал кучу не нужных исследований. C другой стороны, я узнал много интересного про работу resolver»а. А DNS это первое место, которое надо поверять, когда возникают различные задержки в работе программ. Так что, польза всё равно есть.
После исчезновение лавины несовершённых подключений DNS, лог остался забит подключениями на порт 6881.
Kernel: Connection attempt to UDP 192.0.32.10:6881 from 188.85.194.61:24333
Всемирая база знаний подсказала, что UDP 6881 — это, скорее всего, торрент клиенты пытающие установить DHT соединение.
Весьма вероятная версия, на сервере долгое время работал torrent, клиент и хотя он давно уже удалён, память о нём
может неумирать в серцах других боевых товарищей.
Нужно захватить прибывающие на 6881 порт пакеты.
В качестве firewall/NAT у меня используется Packet Filter pf(4). Сразу после правила блокировки по умолчанию добавим правило блокировки и логирования входящих upd соединений на 6881 порт. Параметр quick
заставляет прекратить обработку других правил, если пакет подошёл под текущее.
# ee /etc/pf.conf
block in log quick on em0 proto udp from any to 192.0.32.10 port 6881
# pfctl -oonvf /etc/pf.conf
# pfctl -oovf /etc/pf.conf
В течении нескольких минут запишем результаты в файл для Wireshark.
# tcpdump -i pflog0 -s 0 -w 6881.pcap
Откроем файл в Wireshark и посмотрим. К сожалению, DHT ещё не поддерживается программой. Поэтому всё что можно сделать — посмотреть пакет на предмет сигнатуры.
d1:ad2:id20
:+_,i<^2e1:q4:ping1:t4:H1:v4:UTb1:y1:qe
Поиск по по первым байтам пакета наводит на обсуждение DHT-расширения для Bittorrent. Значит это действительно отголоски долгой работы торрент клиента на сервере.
Всё нормально. Нужно просто очистить лог от подобных записей.
Для этого скажем pf молча отбрасывать пакеты приходящие на 6881 порт, добавив параметр drop
и убрав log.
Этот небольшой пост о плагине Limit Login Attempts, позволяющем защитить админпанели блогов на вордпресс. Плагине, позволяющем ограничить количество попыток взломщиков блогов — хакерам, пытающимся войти в админпанель и овладеть блогом. Способов и плагинов, для защиты от взлома довольно много и среди них есть очень серьезные. Но молодому блогу, с низкой посещаемостью и авторитететом как правило, ничто не угрожает. До поры — до времени. А вот установить Limit Login Attempts можно даже еще не для очень «крутого» блога, каким я отношу, на данный момент, и свой скромный вебресурс.
Вы удивитесь, но после того, как я установил себе этот плагин, я с удивлением обнаружил, что в мой блог пытался проникнуть взломщик под именем admin, который после неудачных попыток, был с помощью плагина был заблокирован на 24 часа. А прошло всего несколько часов после его установки!
Ниже — скрин части письма, которое я получил вчера на свою электронную почту:

Невольно вспомнилось то, как я обнаружил и устранял «дыру» в теме блога . А если бы я все оставил видимым или выбрал логин admin и взломщик подобрал бы пароль?
Надеюсь, что я убедил вас, уважаемые вебмастера, что такой, хоть и очень простой, но легкий плагин не помешает вашему блогу.
Кратко про установку и настройки плагина Limit Login Attempts
Все абсолютно просто: плагин достаточно найти поиском в админпанели по соответствующему названию, установить и активировать.
Затем из Параметров, выбрав плагин, перейти в настройки. В принципе, менять здесь ничего не нужно, но я рекомендую установить «галочку», позволяющую одной из функций Limit Login Attempts отправлять на ваш e-meil сообщения о попытках проникновения хакеров. Эта функция функция плагина позволит получать оперативную сводку о попытках взлома.


Принцип работы плагина Limit Login Attempts
основан на ограничении доступа входа в админпанель сайта при вводе логина и пароля. Иначе говоря, он создает лимит количества попыток авторизации, включая поддержку куки, по IP адресу пользователя интернетом. Совершать администратору сайта каждый раз выход из панели, да еще постоянно чистить куке-файлы — крайне неблагодарная функция. В данном случае, плагин Limit Login Attempts — просто незаменим.
Плагин, кроме всего прочего, предоставляет IP-адрес взломщика и по нему возможно вычислить и наказать хакера всеми доступными средствами.
Дополнительные средства от взлома
Эта статья — как я указывал выше, уже не единственная о безопасности сайтов на Вордпресс. В своем, более раннем, но более подробном мануале о безопасности сайтов -« «, — я так же затронул тему плагинов, предназначенных для подобной функции. В частности, об еще двух плагинах, которые могут работать в связке. Это плагины Login LockDown + Anti-XSS attack (наверное аналогично будет работать и связка Limit Login Attempts + Anti-XSS attack), о работе которых рассказывает Алексей Козымаев в своем видео уроке. Ролик я решил разместить и на этой странице.
Как дополнительное средство от посягательств на сайт, попутно рекомендую плагин, о котором я ни разу не упоминал в своих сообщениях. Называется он Block Bad Queries (BBQ);
этот плагин автоматически защищает сайт от вредоносных запросов URL. Установка — через поиск в админпанели, настроек не требует.
(Visited 43 times, 1 visits today)
WP плагин Limit login Attempts – это один из самых необходимых плагинов,так как защищает сайт от такого хакерского приёма, как brute-force атака.
Суть этого приёма в том, что злоумышленник пытается проникнуть в админку, путём подбора пары логин-пароль.
Все уже, наверное, сталкивались с предупреждением: «У Вас осталось три попытки», возникающем при входах с введением пароля. Вот именно эту работу и делает данный плагин.
После его установки и активации, в консоли, в разделе параметры, появиться строка с названием этого модуля.
Пройдя по по ней мы окажемся на странице настроек.
Настройки тут простые, да и на русском языке. На картинке показаны настройки по умолчанию. Давайте посмотрим, что тут можно изменить.
В первом поле выставляется количество дополнительных попыток. Я у себя оставил 3.
Во втором — ставится продолжительность первой изоляции. Думаю 20-30 минут нормально.
В следующем поле выставляется число изоляций, после которого время изоляции будет увеличено до 24 часов, или более, на Ваше усмотрение.
Я оставил 1, потому, что кто же кроме злоумышленника будет ошибаться трижды, а потом, через полчаса — ещё трижды. Нужно быть конченым склеротиком, чтоб без умысла такое проделать.
Подключение к сайту оставим «Прямое подключение».
Обрабатывать куки логина. «Да» в этой строке, выбирается в том случае, если Вы всю работу по сайту выполняете в одном браузере. Я же, к примеру, использую четыре браузера, и по этому выбрал «Нет».
Сообщать об изоляции — лучше поставить обе галочки, хотя mail пока вроде ни к чему, но и не повредит. В дальнейшем, если Вы продолжите интересоваться программированием, эти адреса можно будет подвергнуть анализу.
На этом настройки плагина Limit login Attempts
закончены. Теперь, если через день или два вернуться на эту же страницу, можно увидеть следующую картинку в разделе статистика.

Это будет означать, что кто-то усиленно пытался проникнуть в Вашу админку при помощи специального скрипта, но это у него не получилось. Можно «Очистить лог».
Плагины для обеспечения безопасности в этом .
Перемена
Иногда ошибки ATTEMPT_.HLP и другие системные ошибки HLP могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл ATTEMPT_.HLP, но когда эти программы удалены или изменены, иногда остаются «осиротевшие» (ошибочные) записи реестра HLP.
В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка ATTEMPT_.HLP. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с FreeBSD 2.2.1. Таким образом, эти поврежденные записи реестра HLP необходимо исправить, чтобы устранить проблему в корне.
Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей ATTEMPT_.HLP не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!
В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как WinThruster (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с ATTEMPT_.HLP. Используя очистку реестра , вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку ATTEMPT_.HLP) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра может резко повысить скорость и производительность системы.
Предупреждение:
Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.
Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с ATTEMPT_.HLP (например, FreeBSD 2.2.1):
- Нажмите на кнопку Начать
. - Введите «command
» в строке поиска… ПОКА НЕ НАЖИМАЙТЕ
ENTER
! - Удерживая клавиши CTRL-Shift
на клавиатуре, нажмите ENTER
. - Будет выведено диалоговое окно для доступа.
- Нажмите Да
. - Черный ящик открывается мигающим курсором.
- Введите «regedit
» и нажмите ENTER
. - В Редакторе реестра выберите ключ, связанный с ATTEMPT_.HLP (например, FreeBSD 2.2.1), для которого требуется создать резервную копию.
- В меню Файл
выберите Экспорт
. - В списке Сохранить в
выберите папку, в которую вы хотите сохранить резервную копию ключа FreeBSD 2.2.1. - В поле Имя файла
введите название файла резервной копии, например «FreeBSD 2.2.1 резервная копия». - Убедитесь, что в поле Диапазон экспорта
выбрано значение Выбранная ветвь
. - Нажмите Сохранить
. - Файл будет сохранен с расширением.reg
. - Теперь у вас есть резервная копия записи реестра, связанной с ATTEMPT_.HLP.
Следующие шаги при ручном редактировании реестра не будут описаны в данной статье, так как с большой вероятностью могут привести к повреждению вашей системы. Если вы хотите получить больше информации о редактировании реестра вручную, пожалуйста, ознакомьтесь со ссылками ниже.
У меня есть конечная точка, которая требует параметр, передаваемый через строку запроса (это глагол GET).
Какой присвоенный код состояния дает, когда этот параметр отсутствует в запросе? 400 тот? или я должен ответить с 404?
[GET /search?q=ok] => 200 OK
[GET /search] => 400 Bad Request? or 404 Not Found? Or 422 Unprocessable Entity? Others?
3 ответа
Лучший ответ
TLDR . HTTP 400 — неверный запрос.
Это 400, потому что пользователь не отправил поле ввода Обязательный .
почему бы не 422 — потому что этот случай подходит для 400. Помня ваших потребителей, вы не должны переходить к непопулярным кодам ответов, если вам это не нужно.
Случаи для HTTP 404:
1) URL-адрес, который запрошенный клиент не существует на вашем сервере (обычно это будет обрабатываться вашим сервером. Разработчику приложения обычно не нужно ничего делать, если вы не хотите иметь красивую страницу 404 и причины SEO).
2) Если это был параметр path, и клиент искал сущность с идентификатором (например, (/students/{id}, и ваше приложение не смогло найти такую сущность, вы можете ответить HTTP 404).
Допустим, пользователь отправил параметр запроса, и вы не нашли ни одного элемента, соответствующего параметру запроса, не делайте ошибку, это все еще HTTP 200 с телом в виде пустого массива или около того (не 404 в отличие от упомянутого в предыдущем случае )
5
so-random-dude
5 Май 2020 в 17:31
Должно быть 400 — Bad Request.
Запрос не может быть понят сервером из-за неправильного синтаксиса. Клиенту НЕ СЛЕДУЕТ повторять запрос без изменений.
404 Не Найдено
Ошибка HTTP 404 Not Found означает, что веб-страница, которую вы пытались открыть, не найдена на сервере. Это ошибка на стороне клиента, которая означает, что либо страница была удалена или перемещена, а URL-адрес не был изменен соответствующим образом, либо вы неправильно ввели URL-адрес.
Это означает, что сервер не может найти указанный вами URI. но в вашем случае URI действителен, но параметры отсутствуют, поэтому 400 — верный способ сделать это.
2
Shivang Agarwal
22 Авг 2018 в 15:55
Какой присвоенный код состояния дает, когда этот параметр отсутствует в запросе? 400 тот? или я должен ответить с 404?
Я бы сказал, что 404 подходит
Код состояния 404 (не найден) указывает, что исходный сервер не нашел текущего представления для целевого ресурса или не желает раскрывать его существование.
Тот факт, что ваша реализация маршрутизации отправляет /search и /search?q=ok одному и тому же обработчику, не означает, что они являются одним и тем же ресурсом. /search идентифицирует ресурс, для него нет текущего представления, поэтому вы отправляете ответ потребителю с объяснением проблемы и помещаете 404 в метаданные.
Большой намек в спецификации это:
Ответ 404 кэшируется по умолчанию
Это позволяет нам информировать клиента (и любые промежуточные компоненты) о том, что этот ответ можно использовать повторно.
Это полезное свойство, и оно не применяется (из коробки) к 400 Bad Request
Эвристический: ваш веб-интерфейс должен действовать как хранилище документов. Если вы попросите хранилище документов предоставить вам документ, но неправильно введете ключ, что вы получите? Некоторая разновидность исключения KeyNotFound. То же самое вы получите, если попросите веб-сервер для документа в вашем домашнем каталоге, но вы неправильно написали имя файла.
семантика ответа указывает правильный код состояния для использования, а не детали реализации.
0
VoiceOfUnreason
22 Авг 2018 в 18:51