Почему команда head, которая поставляется с LWP :: Simple в Perl, работает только тогда, когда я вызываю ее в командной строке? - PullRequest
1 голос
/ 31 октября 2011

У меня есть простая подпрограмма perl, которая проверяет, хранит ли Google по-прежнему копию jquery 1.6, прежде чем решить, печатать ли скрипт, ссылающийся на него или на нашу локально размещенную копию.

Этокопия кода, который я использую.

my $jquery_host = "http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js";
my $header = LWP::Simple::head($jquery_host);

if(defined $header) {
    return qq{<script type="text/javascript" src="$jquery_host"></script>};
}
else {
    return qq{<script type="text/javascript" src="$localPath"></script>};
}

Когда я запускаю этот код в этой командной строке, у меня нет проблем с получением ответа, и он правильно печатает тег сценария, ссылающийся на копию jquery от google.Однако, когда я на самом деле вызываю его из сценария Perl, который создает HTML-страницу, он каждый раз ничего не находит и печатает тег сценария, ссылающийся на нашу собственную копию.

Какие могут быть разрешения или другой тип барьераразорвать это соединение?

Спасибо за вашу помощь.

ПРИМЕЧАНИЕ. Пока это работает только на нашем локальном тестовом сервере.Командная строка также выполняется на тестовом сервере.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Я не знаю, почему ваш код не работает, но вы все равно не должны его использовать: только то, что ваш сервер может достигать ajax.googleapis.com, не означает, что браузер пользователя может.

Вместо этого просто сделайте запасной вариант в JavaScript на клиенте. Вот пример кода на основе этого ответа :

return <<"END";
<script type="text/javascript" src="$jquery_host"></script>
<script type="text/javascript">
if (typeof jQuery == 'undefined') document.write(
    '<'+'script type="text/javascript" src="$localPath"><'+'/script>'
);
</script>
END
1 голос
/ 01 ноября 2011

Я могу подтвердить, что ваш код работает изолированно. Попробуйте включить назначение заголовка в оператор if; на самом деле строка строки URL тоже. Единственная другая вещь, которая может быть связана с вами, - это то, что ваш серверный скрипт работает на машине, которая использует какую-либо оболочку прокси или tcp, которая не позволяет вам получить jQuery с google.com. Мы не можем действительно помочь вам с этими очень специфическими локальными проблемами.

Если бы я только догадался, я бы сказал, что у вас более одной среды Perl, и что ваша командная строка использует хорошую версию, где все работает, но ваш веб-сервер обращается к другой версии, одной это могло бы быть усилено таким образом, чтобы нарушить то, что вы делаете, например, то, что было предложено для использования в AppEngine . Но мои предложения, приведенные выше, основаны на идее, что код вокруг этого фрагмента может работать с переменными, которые вы используете. Похоже, что проблема возникает, хотя вокруг использования io сокетов в mod_perl .

Фрагмент программы:

$ perl -MLWP::Simple -e '
if(head("http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js")) {
    print qq{<script type="text/javascript"
      src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js">
    </script>};
} else {
    print qq{<script type="text/javascript" src="$localPath"></script>};
}'

Выход:

<script type="text/javascript"
  src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js">
</script>

Я бы также написал это так, чтобы какой-нибудь $scriptPath был назначен либо на путь jQuery, либо на $localPath, а затем после оператора if я бы напечатал тег script только один раз, используя теперь определенный $scriptPath , Но это, пожалуй, только я.

...