Я нашел решение для sitemap, по такому же принципу была исправлена ошибка для RSS-ленты.
{{ Request::header('Content-Type : text/xml') }} - устанавливает нужный тип содержимого.
Было:
<?php
header("Content-Type: text/xml;charset=iso-8859-1"); // Здесь была ошибка
echo '<?xml version="1.0" encoding="UTF-8"?>';
?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@foreach ($posts as $post)
<url>
<loc>{{ url($post->slug) }}</loc>
<lastmod>{{ $post->updated_at->tz('GMT')->toAtomString() }}</lastmod>
<changefreq>monthly</changefreq>
<priority>1</priority>
</url>
@endforeach
</urlset>
Исправил:
{{ Request::header('Content-Type : text/xml') }}
<?php echo '<?xml version="1.0" encoding="UTF-8"?>';?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@foreach ($posts as $post)
<url>
<loc>{{ url($post->slug) }}</loc>
<lastmod>{{ $post->updated_at->tz('GMT')->toAtomString() }}</lastmod>
<changefreq>monthly</changefreq>
<priority>1</priority>
</url>
@endforeach
</urlset>
Также, если вы хотите использовать поддержку PHP внутри XML-файлов - можно добавить следующую строчку в файл .htaccess:
AddType application/x-httpd-php .php .xml
php_flag short_open_tag off
Еще можно указать тип в самом контроллере:
public function index()
{
$articles = Article::all()->first();
$categories = Category::all()->first();
$questions = Question::all()->first();
$tags = Tag::all()->first();
return response()->view('sitemap.index', [
'articles' => $articles,
'categories' => $categories,
'questions' => $questions,
'tags' => $tags,
])->header('Content-Type', 'text/xml');
}
Но я сделал немного попроще:
public function sitemap() {
$articles = DB::table('articles')->orderBy('id', 'desc');
return response()->view('sitemap', [
'articles' => $articles,
])->header('Content-Type', 'text/xml');
}