Ошибка PHP / Apache: 406 недопустимо

Поэтому я получил эту ошибку сегодня, я сузил ее до этой проблемы:

Мой сайт – моя музыкальная страница здесь . Это позволяет людям заходить и видеть фотографии меня, новости, мою музыку и события, в которых я играю.

Все шло, я вручную вводил данные в MySQL, чтобы он автоматически загружался на домашнюю страницу. Теперь я добавляю панель управления, чтобы я мог добавлять, редактировать, удалять вещи в базе данных из Интернета.

Все работает отлично, за исключением возможности добавлять / редактировать события. Я сузил его до того, что я не могу ввести 2 URL-адреса, или я получаю эту ошибку. Мне НЕОБХОДИМО вводить 2 URL-адреса (один для просмотра страницы события, один для покупки билетов), но я не могу вводить более 1 за раз, есть ли что-нибудь, что я могу сделать, чтобы исправить или обойти эту ошибку, будь то в apache или моем код?

<?php $specevlink = "http://facebooklink.com"; $specgigtick = "http://ticketplacelink.com"; ?> <form method="post" action="index.php?page=editgigs"> <table> <tr> <td> Event Page (Link): </td> <td style="text-align: left;"> <input type="url" name="giglink" value="<?php echo $specevlink; ?>" /> </td> </tr> <tr> <td> Event Tickets (Link): </td> <td style="text-align: left;"> <input type="url" name="gigtick" value="<?php echo $specgigtick; ?>" /> </td> </tr> </table><br /> <input type="submit" name="editgig" value="submit" /><br /> <br /> </form> 

РЕДАКТИРОВАТЬ:

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

Вот рис. 1-го шага. Вот фото из шага 2

Это входит в файл index.php:

 <?php if(isset($_GET["page"])){ $page = $_GET["page"]; } else { $page = ""; } if($page === "editgigs"){ include ('inc/logincheck.php'); ?> <div class="label"> EDIT GIGS </div><br /> <div style="margin: 0 auto; text-align: center; width: 100%"> <form method="post" action="index.php?page=editgigs"> <?php if(!isset($_POST['selectgigs'])){ if(!isset($_POST['updgigs'])){ ?> Select one of the options below:<br /> <br /> <select name="selgigs" style="max-width: 26%;"> <?php while($gigsall_data = mysqli_fetch_array($gigsall_query)){ $gigid = stripslashes($gigsall_data['idgigs']); $gigdate = stripslashes($gigsall_data['date']); $gigname = stripslashes($gigsall_data['name']); $gigdate = date('F j, Y', strtotime($gigdate)); ?> <option value="<?php echo $gigid; ?>"> <?php echo $gigdate; ?>: <?php echo $gigname; ?> </option> <?php } ?> </select><br /><br /> <input type="submit" name="selectgigs" value="Select" /><br /> <br /> <?php } } if(isset($_POST['selectgigs'])){ $gigtoed = trim($_POST['selgigs']); $specgig_query = mysqli_query($con, "SELECT * FROM `gigs` WHERE `idgigs` = '$gigtoed'") or die(mysqli_error($con)); $specgig_data = mysqli_fetch_array($specgig_query); $specdate = stripslashes($specgig_data['date']); $specname = stripslashes($specgig_data['name']); $specevlink = stripslashes($specgig_data['evlink']); $specgigtick = stripslashes($specgig_data['ticklink']); $specnos = stripslashes($specgig_data['noshow']); if($specnos === '0'){ $noshow = ''; } else { $noshow = 'checked'; } ?> <table style="border-spacing: 5px; padding: 10px;"> <tr> <td> Past Event?: </td> <td style="text-align: left;"> <input type="checkbox" name="nos" <?php echo $noshow; ?> /> Past Event </td> </tr> <tr> <td> Date: </td> <td style="text-align: left;"> <input type="date" name="gigdate" value="<?php echo $specdate; ?>" required /> </td> </tr> <tr> <td> Name: </td> <td style="text-align: left;"> <input type="text" name="gigname" value="<?php echo $specname; ?>" required /> </td> </tr> <tr> <td> Event Page (Link): </td> <td style="text-align: left; width: 350px;"> <input type="url" name="giglink" style="width: 100%;" value="<?php echo $specevlink; ?>" /> </td> </tr> <tr> <td> Event Tickets (Link): </td> <td style="text-align: left; width: 350px;"> <input type="url" name="gigtick" style="width: 100%;" value="<?php echo $specgigtick; ?>" /> </td> </tr> </table><br /> <input type="hidden" name="gigid" value="<?php echo $gigtoed; ?>" /> <input type="submit" name="updgigs" value="Update" /><br /> <br /> <?php } if(isset($_POST['updgigs'])){ $newid = trim($_POST['gigid']); $newdate = mysqli_real_escape_string($con, trim($_POST['gigdate'])); $newname = mysqli_real_escape_string($con, trim($_POST['gigname'])); $newlink = mysqli_real_escape_string($con, trim($_POST['giglink'])); $newtick = mysqli_real_escape_string($con, trim($_POST['gigtick'])); if(isset($_POST['nos'])){ $newnoshow = mysqli_real_escape_string($con, '1'); } else { $newnoshow = mysqli_real_escape_string($con, '0'); } echo $newid.' '.$newdate.' '.$newname.' '.$newlink.' '.$newtick.' '.$newnoshow.'<br />'; /*mysqli_query($con, "UPDATE `gigs` SET `date` = '$newdate', `name` = '$newname', `evlink` = '$newlink', `ticklink` = '$newtick', `noshow` = '$newnoshow' WHERE `idgigs` = '$newid' LIMIT 1") or die(mysqli_error($con));*/ //commented for testing ?> <div style="text-align: center;"> <span class="confirm"> Successfully updated click <a href="index.php?page=events">here</a> to view it! </span> </div> <?php } ?> </form> </div> <?php } 

FYI- logincheck.php ничего не делает, кроме как проверяет, зарегистрирован ли пользователь, если он не отправляет их на домашнюю страницу.

Ваш сайт генерирует ошибку, если какой-либо элемент ввода пользователя начинается с http:// или https:// .

Когда я пытаюсь со ссылкой, начинающейся с http:// я получил 406 Not Acceptable:

http://onkore.us/?blah=http://www.google.com

Это нормально, когда я пробую это:

http://onkore.us/?blah=www.google.com

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

http://onkore.us/?blah1=www.google.com&blah2=www.google.com

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

Я не уверен, помогает ли это обходное решение, но, учитывая, что http:// или https:// создает проблему, я думаю, что нужно удалить http:// и https:// из пользовательского ввода. Сначала вы можете попробовать изменить <input type="url" на <input type="text" чтобы формат URL не был применен. Затем вы можете использовать Javascript для удаления вхождений http:// и https:// из пользовательского ввода в форме перед отправкой на сервер. Кроме того, вы можете удалить их из данных перед заполнением значений формы.

Надеюсь это поможет .

Regex: как удалить «http: //» из URL-адреса в JavaScript

Эта ошибка означает, что, например, вы запрашиваете сервер для книг (и вы понимаете только испанский язык). На сервере есть только английская и немецкая книги.
Поэтому у сервера есть ваш ответ, но он не даст его вам, потому что он знает, что вы ничего не сделаете полезным, или вы сделаете с ним что-то плохое! (например, не читать книги и бросать их на головы людей, например).

406 Not Acceptable "- это необычный код состояния – наиболее распространенными являются 200, 404, 500, 301. Вы видите только 406, когда что-то не так с сервером, как правило, что-то глупо, но трудно диагностировать.

Также:

Эта общая ошибка означает, что запрошенный вами запрос был обнаружен как потенциальная попытка взлома сервера […]
https://billing.stablehost.com/knowledgebase/178/What-does-406-Not-Acceptable-mean.html


Наиболее распространенное решение этой ошибки связано с mod_security.

1. Mod_security

ModSecurity может контролировать HTTP-трафик в реальном времени, чтобы обнаруживать атаки […], он работает как средство обнаружения вторжений в сети. ModSecurity также может действовать немедленно, чтобы предотвратить атаки от веб-приложений.

Эта ошибка 406 может быть от mod_security как ответ от возможной атаки через POST, передавая некоторый url вместо обычного и обычного текста.

Наиболее распространенным решением является отключить проверку POST и фильтрацию mod_security в htaccess:

 <IfModule mod_security.c> SecFilterEngine Off SecFilterScanPOST Off </IfModule> 

Кроме того, в терминале выполните:

 sudo a2dismod security2_module sudo service apache2 restart 

Чтобы отключить ModSecurity.

Если это не работает, отредактируйте файл

/etc/apache2/mod-security/modsecurity_crs_10_config.conf

И добавьте # в начале строки, которая имеет что-то вроде этого:

SecDefaultAction “phase:2,log,deny,status:403,t:lowercase,t:replaceNulls,t:compressWhitespace”

Наконец, перезапустите apache

sudo service apache2 restart

У меня была эта проблема некоторое время и только время от времени, поэтому было трудно определить.

Однако после некоторого тестирования я обнаружил ошибку в моем случае. Это может быть не у вас, но если у кого-то есть ошибка 406 Not Acceptable , стоит сделать снимок.

В моем случае эта ошибка возникала, когда в опубликованных данных содержалась «shell:», что, как я предполагаю, интерпретируется неправильно и возникает ошибка. Решение для меня состояло в том, чтобы заменить эту строку перед отправкой.