El problema es el siguiente: hemos desarrollado una aplicación de Laravel y la tenemos que desplegar en un servidor que tiene en el directorio raiz, otra aplicación que no es de Laravel, un landing page, o una página web "normal", por ejemplo.

Supongamos que la página está en una intranet, y tiene el nombre https://micorp.com.

En algunos ambientes corporativos, no tenemos control sobre el DNS, o hay unas políticas que no permiten la creación de subdominios, por lo que no podemos crear un servidor virtual en el Apache, cosa que resolvería nuestros problemas al crear algo asi como https://miapp.micorp.com

Por lo anterior, tendremos que instalar la aplicación de Laravel bajo un subdirectorio del servidor principal, de forma que quede https://micorp.com/miapp ¿cómo se hace con Laravel?

Para este artículo asumiremos que el sistema operativo de destino es Linux y que el directorio donde se encuentra la aplicación será /var/apache/html/

Copiar la aplicación al directorio final

Aquí hay varias formas de hacerlo, la forma más simple es copiando el directorio completo desde el ambiente de desarrollo al directorio /var/apache/html/miapp. Otra forma, es utilizar git, como se describe en éste artículo. Personalmente, prefiero la segunda forma, porque tenemos un buen control de acceso a nuestra intranet, y usar git me permite sincronizar contra la última versión productiva de la aplicación.

Separar la carpeta public del resto de la aplicación

Ahora tenemos que "partir en dos" la aplicación de Laravel, esto es, poner el directorio public en la carpeta ../miapp y poner el resto de los subdirectorios en otra carpeta, por ejemplo ../miapp-resources, los siguientes comandos me parecen que son los más eficientes para este propósito:

server:/var/apache/html# mv miapp miapp-resources
server:/var/apache/html# cd miapp-resources
server:/var/apache/html/miapp-resources# mv public ..
server:/var/apache/html/miapp-resources# cd ..
server:/var/apache/html# mv public miapp

Modificar el archivo miapp/index.php

Ahora modificamos el archivo index.php, cambiamos la linea
require __DIR__.'/../vendor/autoload.php';
por
require __DIR__.'/../app-resources/vendor/autoload.php';

y la línea
$app = require_once __DIR__.'/../bootstrap/app.php';
por
$app = require_once __DIR__.'/../app-resources/bootstrap/app.php';

Modificar el archivo miapp-resources/server.php

Ahora, vamos a hacer algo similar con el archivo miapp-resources/server.php, se cambiará la línea
if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) {
por
if ($uri !== '/' && file_exists(__DIR__.'/../miapp'.$uri)) {

y la línea
require_once __DIR__.'/public/index.php';
por
require_once __DIR__.'/../miapp/index.php';

Con estos cambios, la aplicación en http://micorp.com/miapp debería estar funcionando. Se puede probar haciendo las migraciones y sembrado de la base de datos.

Posibles problemas

Un problema con el que me he enfrentado es que la aplicación no funciona porque dice que no puede escribir en el log. Generalmente esto se debe a permisos, ya que al copiar los archivos el dueño quedó como root. Lo único que hay que hacer en este caso es cambiar el dueño a www-root:

server:/var/apache/html# chown www-data miapp -R
server:/var/apache/html# chown www-data miapp-resources -R