Как проверить, является ли URL-адрес iframe встраиваемым в PHP?

Некоторые веб-сайты нельзя встраивать через iframe. Они выдают следующую ошибку:

Refused to display 'https://news.ycombinator.com/news' in a frame because it 
set 'X-Frame-Options' to 'DENY'. 

Наше приложение позволяет отправлять URL-адреса от пользователей. Мы хотим проверить на стороне сервера, можно ли встроить веб-сайт в iframe, и добавить соответствующий флаг. На клиенте мы проверяем флаг и либо встраиваем iframe, либо просто предоставляем прямую ссылку на веб-страницу.

Как проверить, будет ли веб-сайт поддерживать iframe или нет?


person Websirnik    schedule 09.09.2013    source источник
comment
Используйте get_headers, чтобы сделать запрос к странице и найти заголовок x-frame-options.   -  person Jonathan Kuhn    schedule 09.09.2013


Ответы (3)


X-Frame-Options — это заголовок ответа, отправленный сервером, поэтому пусть ваш сервер выполнит HTTP-запрос GET для URL-адреса, который вы хотите протестировать, посмотрите, присутствует ли заголовок X-Frame-Options, и если он... судя по спецификацию вам вряд ли вообще разрешат встроить ее.

person Sammitch    schedule 09.09.2013

Попробуйте этот код:

$url = "http://www.google.com/";
$url_headers = get_headers($url);
foreach ($url_headers as $key => $value)
{
    $x_frame_options_deny = strpos(strtolower($url_headers[$key]), strtolower('X-Frame-Options: DENY'));
    $x_frame_options_sameorigin = strpos(strtolower($url_headers[$key]), strtolower('X-Frame-Options: SAMEORIGIN'));
    $x_frame_options_allow_from = strpos(strtolower($url_headers[$key]), strtolower('X-Frame-Options: ALLOW-FROM'));
    if ($x_frame_options_deny !== false || $x_frame_options_sameorigin !== false || $x_frame_options_allow_from !== false)
    {
        echo 'url prevent iframe!';
    }
}
person parse    schedule 05.06.2015

Я написал эту функцию:

function allowEmbed($url) {
    $header = @get_headers($url, 1);

    // URL okay?
    if (!$header || stripos($header[0], '200 ok') === false) return false;

    // Check X-Frame-Option
    elseif (isset($header['X-Frame-Options']) && (stripos($header['X-Frame-Options'], 'SAMEORIGIN') !== false || stripos($header['X-Frame-Options'], 'deny') !== false)) {
        return false;
    }

    // Everything passed? Return true!
    return true;
}
person Scribilicious    schedule 28.07.2015
comment
Это вернуло true при встраивании Reddit; не уловил заголовок перекрестного происхождения. - person Albert MN.; 23.02.2018