En primer lugar me gustaría aclarar un concepto que quizá tu ya tienes claro: diferencia la caché del navegador web (lado cliente) con una posible caché en el servidor (lado servidor).
Cualquier solución de caché en el lado del servidor (relacionado con Laravel o PHP) facilita que las páginas dinámicas se generen más rápido, consuman menos recursos del servidor o incluso se omita su generación y se utilice una versión anterior. Quería aclararlo porque en tu pregunta mencionas PHP y Laravel, y sobre ellos podría aplicarse este otro tipo de cacheado.
A la caché que tu te refieres es la caché del navegador, que hace que éste guarde una versión de los archivos de la página (imágenes, ficheros javascript, css...) para no descargarlos cada vez que el cliente los necesita.
Para que pueda utilizarse este tipo de caché, tu página tiene que darle al navegador del usuario unas directivas que indiquen si el contenido debe cachearse o no (si es un contenido que cambia continuamente no conviene que el navegador lo guarde). Esas directivas, se le pueden indicar al navegador de dos maneras:
- A nivel del protocolo HTTP (tanto el .htaccess como el header)
- A nivel de sintáxis HTML (solución de meta etiquetas)
Es más completa la solución a nivel de protocolo HTTP porque tiene mayor soporte con los navegadores y es respetada por otros dispositivos como proxies, pero en la mayoría de casos de uso ambas funcionan bien.
A nivel de protocolo configurarlo en el .htaccess o mediante un header especificado no tiene diferencias porque el resultado es el mismo. Lo que hace el .htaccess es indicarle al servidor web que añada automáticamente el header a todas las respuestas, mientras que de la otra manera le indicas a qué respuesta concreta le cambias el header. Podría decirse que una solución es la regla general (.htacess) y la otra la regla particular (colocar manualmente el header).