У меня есть кнопка на странице с onClick, которую я динамически устанавливаю с помощью Jquery.
Эта кнопка запускает загрузку файла.
Я использую mod_rewrite, чтобы превратить http://somesite.com/blah1/blah2/blah3/blah4 в index.php & q = $ 1
Затем я получаю доступ к q, делю на / и получаю любой запрошенный пользователем путь в виде массива.
Прекрасно работает, за исключением того, что я не могу отправить закодированный путь как одну из моих переменных:
<?php
$html = '<button onClick="window.location = \'' . SITE_URL . 'downloadLog/' . urlencode($some_path) . ">Click me</button>';
Посмотрел AllowEncodedSlashes On для Apache.
Попробовал .. Всегда получайте либо% 2Fvar% 2Fadm% 2Fmessages, даже после urldecode () или rawurldecode (), либо apache, пытающийся перейти куда-то, чего не существует, даже если мой mod_rewrite включил / преобразовал их в q =.
Итак ... новая идея заключается в том, что я просто создаю форму на клике и отправляю ее. У POST не будет проблем с моим urlencoded-путем в качестве параметра.
Так как это предназначено для включения в onClick, и мой onClick = использует двойные кавычки (это часть другого огромного фрагмента кода, который я не могу сейчас легко изменить), я думаю, что у меня возникают проблемы с правильным экранированием, я думаю. Сломался и не использовал кавычки вокруг моего идентификатора / имени в качестве крайней меры, все еще без игры в кости.
Итак, вот что я придумала. Это не ошибка в firebug, но я также не вижу, что происходит POST.
function get_inline_post($a) {
$output .= 'this_form = $(\'<form submit=' . SITE_URL . $a['submit'] . ' ></form>\').html(\'\')';
unset($a['submit']);
foreach ( $a as $key => $value ) {
$output .= '.append(\'<input id=' . $key . ' name=' . $key . ' type=hidden>\')';
}
$output .= ';';
foreach ($a as $key => $value ) {
$output .= '$(\'#' . $key . '\').val(\'' . rawurlencode($value) . '\');';
}
$output .= 'this_form.submit();';
return $output;
}
Который, учитывая правильные переменные, заканчивает тем, что строит это для моего onClick:
<button class="ui-corner-all"
onClick="
this_form = $('<form submit=/downloadHostLog/messages></form>').html('').append('<input id=link_hcmdb_id name=link_hcmdb_id type=hidden >').append('<input id=added_path name=added_path type=hidden >');
$('#link_hcmdb_id').val('046345D4771C4D3FBD2EF33CBE038028');$('#added_path').val('var%2Fadm');this_form.submit();
"
title="Kill me now" type="button">
<span class="ui-icon ui-icon-copy"></span>
</button>
Помните, я пытаюсь начать загрузку здесь, поэтому ответы с .post () бесполезны. Спасибо.
Edit:
Я открыт для использования оригинальной идеи просто кодировать его в скрипте window.location, но я уже потратил на это весь день. На самом деле сделал таблицу и попробовал все варианты:
одинарное кодирование urlen, двойное кодирование urlencoding, различные уровни кодирования, входящие и выходящие.
rawurlencode против urlencode,
AllowEncodedSlashes On / Off
На данный момент я предполагаю, что моя комбинация использования mod_rewrite, разделения на / для генерации исходного пути запроса в виде массива и AllowEncodedSlashes может просто не работать вместе.
Я также исключаю тот факт, что кнопки отправляются пользователю через ajax, и эта кнопка фактически заканчивается в jqgrid.
Это одна из причин, по которой я хочу просто включить onClick при генерации вместо выполнения
$().click(function(){blah});
для каждой строки результатов, поскольку каждая строка имеет 5 различных параметров, отличных от того, что я здесь показываю, которые уникальны для каждой строки в целях безопасности ... поэтому я в любом случае вызываю связывание 50-500 раз, что было мучительно медленно.
То, что я делал ранее, это просто генерирование uid для каждой строки, сохранение его в переменной сеанса и разыменование его обратно, когда пользователь посетил / downloadLog / UID. Это также сработало, но мне нравится хранить информацию о сеансе под 4 КБ по соображениям производительности, и при этом легко доводилось до 16 КБ.
Простая замена / на | до кодирования и изменения обратно после работы, но я отказался прибегнуть к созданию такой ошибки.
РЕДАКТИРОВАТЬ: @dqhendricks Мой текущий оператор mod_rewrite:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)? index.php?q=$1 [L,QSA]
Соответствующий php, который обрабатывает это:
foreach ( preg_split('/\//',$_GET['q']) as $key => $value)
{
$g[$key] = urldecode($value);
}
Учитывая вышесказанное, я попытался включить и выключить AllowEncodedSlashes. Ни один из них не позволил / blah / blah /% 2F% var% 2Fadmin / blah даже быть направленным в index.php. Получил 404.