2016-02-21 6 views
0

Я прочитал сообщения here и here, но не могу получить право кодирования.Настройка Javascript iframe src - правильный формат

В javascript я пишу ссылку на <input>, которая затем считывается с помощью document.getElementById ('downloadlink'). Значение и помещается в iframe src для выполнения.

Код отлично работает на моем локальном хосте, но не на сервере, где файл никогда не загружается из-за недопустимого имени (обратите внимание: http 302 Moved Temporarily вызван перенаправлением .htaccess из-за неверного запроса файла). Я уверен, что это проблема с кодировками амперсандов. Я понимаю, что input требует кодирования амперсандов (и других html-сущностей). Я использую php.js эквиваленты htmlspecialchars() и htmlspecialchars_decode() для этого (опять же это работает на localhost).

Для img.src, я понимаю, что я хочу, чтобы амперсанды закодированы до &amp; Однако на моем локальном хосте он работает без них, но не с ними закодирован. На моем живом сайте это не работает в любом случае.

Чтобы закодировать их, я попробовал:

url = url.replace(/&/g, "&amp;"); 

Пора перестать рвать на себе волосы и попросить о помощи. Кто угодно?

iframe (с кодировкой из js htmlspecialchars) ПРИМЕЧАНИЕ: Я не могу получить &amp;, чтобы оставаться закодированным для отображения - они заменяются при сохранении.

<iframe src="www.waldorfteacherresources.com/getfile.php?file=g2-saints-martin-009.jpg&amp;mode=download&amp;hv=4443f86959bf104e1df0eac204b8aaf226ae533b&amp;wtrpath=docs " id="iframe" height="0" width="0" hidden=""></iframe> 

Код

function downloadfile() { 
    if (document.getElementById("downloadlink")) { 
    var div = document.getElementById('datadiv'); 
    var url = hx(document.getElementById('downloadlink').value); 
    var ifrm = document.createElement("iframe"); 

    ifrm.setAttribute("src", url); 
    ifrm.setAttribute("id", "iframe"); 
    ifrm.height = 0; 
    ifrm.width = 0; 
    ifrm.hidden = true; 
    div.appendChild(ifrm); 
    } 
} 

// support functions to encode/decode 

// encodes output - equivalent of php hx function 
// hx notation is a shortcut for htmlspecialchars() with all options set 
function hx(string, flags, charsetEncoding, double_encode) { 
    if (typeof flags == "undefined"){ 
     flags = 0; 
    } 
    if (typeof charsetEncoding == "undefined"){ 
    charsetEncoding = "UTF-8"; 
    }  
    if (typeof double_encode == "undefined"){ 
     double_encode = true; 
    } 

    // constants not valid until php v 5.4 
    var ENT_HTML401 = 0; 
    var ENT_HTML5 = (16 | 32); 
    var ENT_COMPAT = 2; 
    if (flags == 0) { 
    flags = ENT_COMPAT | ENT_HTML401; 
    } 
    string = htmlspecialchars(string, flags, charsetEncoding, double_encode); 
    return string; 
} 

// decodes output of hx()/htmlspecialchars() - shortcut notation for htmlspecialchars_decode() 
function hdx(string) { 
    return htmlspecialchars_decode(string); 
} 

function htmlspecialchars(string, quote_style, charset, double_encode) { 
    //  discuss at: http://phpjs.org/functions/htmlspecialchars/ 
    var optTemp = 0, 
    i = 0, 
    noquotes = false; 
    if (typeof quote_style === 'undefined' || quote_style === null) { 
    quote_style = 2; 
    } 
    string = string.toString(); 
    if (double_encode !== false) { // Put this first to avoid double-encoding 
    string = string.replace(/&/g, '&amp;'); 
    } 
    string = string.replace(/</g, '&lt;') 
    .replace(/>/g, '&gt;'); 

    var OPTS = { 
    'ENT_NOQUOTES': 0, 
    'ENT_HTML_QUOTE_SINGLE': 1, 
    'ENT_HTML_QUOTE_DOUBLE': 2, 
    'ENT_COMPAT': 2, 
    'ENT_QUOTES': 3, 
    'ENT_IGNORE': 4 
    }; 
    if (quote_style === 0) { 
    noquotes = true; 
    } 
    if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags 
    quote_style = [].concat(quote_style); 
    for (i = 0; i < quote_style.length; i++) { 
     // Resolve string input to bitwise e.g. 'ENT_IGNORE' becomes 4 
     if (OPTS[quote_style[i]] === 0) { 
     noquotes = true; 
     } else if (OPTS[quote_style[i]]) { 
     optTemp = optTemp | OPTS[quote_style[i]]; 
     } 
    } 
    quote_style = optTemp; 
    } 
    if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) { 
    string = string.replace(/'/g, '&#039;'); 
    } 
    if (!noquotes) { 
    string = string.replace(/"/g, '&quot;'); 
    } 

    return string; 
} 

function htmlspecialchars_decode(string, quote_style) { 
    //  discuss at: http://phpjs.org/functions/htmlspecialchars_decode/ 
    var optTemp = 0, 
     i = 0, 
     noquotes = false; 
    if (typeof quote_style === 'undefined') { 
    quote_style = 2; 
    } 
    string = string.toString().replace(/&lt;/g, '<').replace(/&gt;/g, '>'); 
    var OPTS = { 
    'ENT_NOQUOTES': 0, 
    'ENT_HTML_QUOTE_SINGLE': 1, 
    'ENT_HTML_QUOTE_DOUBLE': 2, 
    'ENT_COMPAT': 2, 
    'ENT_QUOTES': 3, 
    'ENT_IGNORE': 4 
    }; 
    if (quote_style === 0) { 
    noquotes = true; 
    } 
    if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags 
    quote_style = [].concat(quote_style); 
    for (i = 0; i < quote_style.length; i++) { 
     // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4 
     if (OPTS[quote_style[i]] === 0) { 
     noquotes = true; 
     } else if (OPTS[quote_style[i]]) { 
     optTemp = optTemp | OPTS[quote_style[i]]; 
     } 
    } 
    quote_style = optTemp; 
    } 
    if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) { 
    string = string.replace(/&#039;/g, "'"); 
    } 
    if (!noquotes) { 
    string = string.replace(/&quot;/g, '"'); 
    } 
    // Put this in last place to avoid escape being double-decoded 
    string = string.replace(/&amp;/g, '&'); 

    return string; 
} 


The request headers 

    GET /www.example.com/getfile.php?file=myfile.jpg&mode=download&hv=939afca0cdaafd55a1e1471da7463be9acbf5478&wtrpath=docs HTTP/1.1 
    Host: www.example.com 
    Connection: keep-alive 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
    Upgrade-Insecure-Requests: 1 
    User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36 
    Referer: http://www.waldorfteacherresources.com/index.php?grade=2&page=Saints 
    Accept-Encoding: gzip, deflate, sdch 
    Accept-Language: en-US,en;q=0.8 
    Cookie: id=XXX; 
    PHPSESSID=.... session info here 

The response 

    HTTP/1.1 302 Moved Temporarily 
    Date: Sun, 21 Feb 2016 21:16:05 GMT 
    Server: Apache 
    X-Powered-By: PHP/5.5.32 
    **** this is an .htaccess redirect due to an invalid file request 
    Location: /index.php 
    Cache-Control: max-age=86400 
    Expires: Thu, 01 Jan 1970 00:00:00 GMT 
    Vary: Accept-Encoding 
    Content-Encoding: gzip 
    Content-Length: 767 
    Keep-Alive: timeout=3, max=100 
    Connection: Keep-Alive 
    Content-Type: text/html; charset=UTF-8 
+1

Нет необходимости кодировать URL-адрес HTML. Вы * должны * беспокоиться о кодировке URI для любых имен параметров и значений в URL-адресе, и это совсем другой вид кодирования. – Pointy

+0

Кроме того, вы можете установить атрибуты '.src' и' .id' вашего iframe-элемента как свойства, так же, как вы устанавливаете '.height' и' .width' - не нужно вызывать '.setAttribute()' , – Pointy

+0

@Pointy Я пробовал кодировать url с encodeURIComponent для src, но это не удалось как для localhost, так и для web. Почему локальный хост работает и не работает? – mseifert

ответ

0

Оказывается, что это не амперсанды на всех, но формат URL. www.example.com не работал из src - тогда http://www. сделал. www. действителен только для моего сайта - не знаю, почему и как связь с сервером отличается от src, чем от командной строки браузера. Но это было.

+0

www.example.com без протокола рассматривается как подпапка в вашем домене, например: http://example.org/www.example.com –

Смежные вопросы