Почему фид с товарами из 1С-Битрикс отображается как PHP, хотя в заголовке указан тип text/xml?

Здравствуйте. 

Я использую стандартный функционал генерации фидов с товарами 1С-Битрикса под названием "Экспорт данных". Фиды создаются с помощью cron и генерируются в виде PHP файла, который выводит XML через `echo`. 

Первые 10 строк фида выглядят следующим образом: 
<pre><code class="php">&lt;? $disableReferers = false;
if (!isset($_GET["referer1"]) || strlen($_GET["referer1"])&lt;=0) $_GET["referer1"] = "yandext";
$strReferer1 = htmlspecialchars($_GET["referer1"]);
if (!isset($_GET["referer2"]) || strlen($_GET["referer2"]) &lt;= 0) $_GET["referer2"] = "";
$strReferer2 = htmlspecialchars($_GET["referer2"]);
header("Content-Type: text/xml; charset=windows-1251");
echo "&lt;"."?xml version=\"1.0\" encoding=\"windows-1251\"?"."&gt;"?&gt;
&lt;!DOCTYPE yml_catalog SYSTEM "shops.dtd"&gt;
&lt;yml_catalog date="2024-11-19 17:27"&gt;
&lt;shop&gt;</code></pre> 

Проблема в том, что файл начинается с <code class="php">&lt;?xml</code>, и это не вызывает проблем, поскольку задан тип документа <b>text/xml</b>. Однако иногда тип документа игнорируется, и файл обрабатывается как PHP, что приводит к неправильной интерпретации первых символов <code class="php">&lt;?</code>. 

В результате, при скачивании файла с помощью wgrt его содержимое отображается корректно, тогда как `curl` или `file_get_contents()` возвращают пустой документ. 

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

Не могу понять, в чем может быть проблема — может, это сбой в Apache? Подскажите, как это можно исправить. Спасибо!
  • 19 ноября 2024 г. 11:23
Ответы на вопрос 1
Проблема, с которой вы столкнулись, связана с тем, как веб-сервер (в данном случае Apache) обрабатывает PHP-скрипты и отправляет заголовки. При этом контент, который генерируется скриптом, должен быть правильно интерпретирован клиентами, такими как `curl` или `file_get_contents()`. 

Вот несколько возможных причин и решений вашей проблемы:

1. **Пробелы и пустые строки перед открывающим тегом PHP**: Убедитесь, что в начале вашего PHP файла нет пробелов или пустых строк перед `<?`. Если они есть, это может привести к тому, что заголовок `Content-Type` не будет установлен правильно. 

2. **Ошибки при выполнении скрипта**: Если в скрипте есть ошибки до этой строки, и они не обрабатываются, это может привести к тому, что вместо XML будет возвращён вывод ошибок PHP. Убедитесь, что у вас включена обработка ошибок для разработки, чтобы видеть возможные проблемы: 
   ```php
   error_reporting(E_ALL);
   ini_set('display_errors', 1);
   ```

3. **Заголовки**: Убедитесь, что `header("Content-Type: text/xml; charset=windows-1251");` вызывается до вывода любого контента. Это критически важно для корректной работы.

4. **Правильные настройки Apache**: Проверьте конфигурацию вашего Apache на наличие директив, которые могут влиять на обработку PHP-файлов. Иногда может быть настроена неправильная обработка MIME-типов.

5. **Кеширование**: Если вы используете какие-либо системы кеширования, убедитесь, что у вас нет кеша, который может возвращать старую версию вашего файла.

6. **Проблемы с правами или доступностью файла**: Убедитесь, что `curl` или `file_get_contents()` могут получить доступ к файлу (например, через правильный URL) и что разрешения на файл или директорию позволяют это.

Если ничего из вышеперечисленного не работает, вы можете временно добавить логирование в ваш скрипт для отладки. Например, логируйте начало выполнения скрипта и текущее содержимое перед выводом, чтобы понять, где может быть проблема. 

Также, если у вас есть доступ к логам сервера (например, error_log Apache), не забудьте проверить их на наличие каких-либо сообщений об ошибках, которые могут помочь выявить источник проблемы.
Похожие вопросы