Слушай, если ты видишь yourdomain.com/public, это не баг. Это Laravel так говорит: «Эй, ты дебил, смотри, я тут стою, и не хочу, чтобы ты лазил по своим файлам, делай через public». Но в продакшне это выглядит как-то… дико.

Есть три пути убрать этот public, и каждый из них либо требует мозгов, либо терпения.

1. Apache

Самый простой вариант, если ты на Apache и у тебя доступ к конфигам:

<VirtualHost *:80>
    ServerName yourdomain.com
    DocumentRoot /path/to/laravel/public

    <Directory /path/to/laravel/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Главное — не забудь перезапустить Apache:

sudo service apache2 restart

Если не перезапустишь, то все твои изменения просто проигнорируются, и ты будешь злиться на пустое место.

2. Nginx

Если Nginx — то ситуация чуть сложнее, но всё равно терпимо:

server {
    listen 80;
    server_name yourdomain.com;
    root /path/to/laravel/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

После правки — перезагружаем:

sudo service nginx restart

И да, не пытайся сэкономить на пути к public. Если он не точный, Nginx просто отдаст 404 и посмеется в твою сторону.

3. .htaccess

Если у тебя нет доступа к конфигам сервера, можно сделать через .htaccess. Да, это уродливо, но работает:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

Минус в том, что модуль mod_rewrite должен быть включен. И в некоторых конфигурациях это может выстрелить тебе в ногу. Реально — метод для локалки или если сервер под контролем «не твоей» хостинг-компании.

Почему это важно

Потому что yourdomain.com/public выглядит как любительский проект. В реальной жизни никто не будет уважать твой код только за то, что ты на Laravel. Убираешь public — выглядит цивильно.

Итог

  • Apache — меняешь DocumentRoot, перезапускаешь.
  • Nginx — точный путь к public, перезапуск, проверка PHP-FPM.
  • .htaccess — только если ты на шаред-хостинге и другого выхода нет.