Marcar URLs como no indexables con Middlewares en Laravel
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');
});