Marcar URLs como no indexables con Middlewares en Laravel

Marcar páginas como no indexables usando Middlewares es mi opción favorita, ya que podemos saber de un plumazo qué URLs no se están indexando.

Marcar URLs como no indexables con Middlewares en Laravel
Photo by Firmbee.com / Unsplash

Hay 3 formas con las que podemos pedirle a los robots que no indexen nuestras páginas:

  • El fichero robots.txt
  • Una etiqueta <meta name="robots" content="noindex">
  • Un header X-Robots-Tag en la respuesta del servidor

Las 3 opciones son válidas y, además, complementarias entre sí. Nuestros proyectos Laravel ya vienen con un fichero robots.txt básico preparado, sin embargo, hoy quería hablar de la 3 opción.

Esta última opción es de mis favoritas para marcar páginas como no indexables, ya que podemos ver de un plumazo en nuestro fichero web.php todas las rutas que no son indexables.

Para hacerlo, primero creamos un middleware:

php artisan make:middleware NoIndex

Una vez creado, añadimos el header después de la llamada a $next($request):

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class NoIndex
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        return $next($request)
            ->header('X-Robots-Tag', 'noindex');
    }
}

Tan simple como esto. Ahora, configuramos nuestro middleware en el fichero app/Http/Kernel.php y ya podremos usarlo:

/**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array<string, class-string|string>
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        // ...
        'noindex' => \App\Http\Middleware\NoIndex::class,
    ];

Una vez hecho esto, ya podemos usar el middleware en nuestras rutas y podremos saber de forma rápida y en cualquier momento qué rutas están siendo indexadas y cuáles no:

// web.php

Route::view('content/legal', 'content.legal')->middleware('noindex');
Route::view('content/privacy', 'content.privacy')->middleware('noindex');
Route::view('content/cookies', 'content.cookies')->middleware('noindex');

// o...

Route::middleware('noindex')->group(function () {
	Route::view('content/legal', 'content.legal');
	Route::view('content/privacy', 'content.privacy');
	Route::view('content/cookies', 'content.cookies');
});