You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在LAMP环境下为Laravel配置虚拟主机及子域名路由问题

解决Ubuntu 17上Laravel子域名虚拟主机配置及访问问题

嘿,我看你碰到了Laravel子域名虚拟主机的配置问题,还踩了一个常见的坑——把Laravel内置服务器和Apache虚拟主机搞混了!先给你理清这个核心误区,再一步步带你完成配置:

一、先搞懂:为什么php artisan serve没用?

php artisan serve是Laravel自带的轻量开发服务器,它完全独立于Apache/Nginx,不会读取你配置的虚拟主机规则,默认只响应localhost:8000的请求。如果你已经配置了Apache虚拟主机,就别再用php artisan serve了,直接通过浏览器访问你的子域名就行。

二、Ubuntu 17上Apache虚拟主机完整配置步骤

假设你的Laravel项目放在/var/www/laravel-blog,子域名是blog.example.dev,跟着下面的步骤来:

1. 配置本地DNS解析(hosts文件)

先让你的电脑能识别blog.example.dev这个域名:

  • 打开hosts文件:sudo nano /etc/hosts
  • 在文件末尾添加一行:127.0.0.1 blog.example.dev
  • 保存退出(按Ctrl+O,回车确认,再按Ctrl+X)

2. 创建Apache虚拟主机配置文件

  • 切换到Apache虚拟主机配置目录:cd /etc/apache2/sites-available
  • 创建新的配置文件:sudo nano blog.example.dev.conf
  • 粘贴以下配置(记得把/var/www/laravel-blog替换成你实际的项目路径):
<VirtualHost *:80>
    ServerName blog.example.dev
    ServerAdmin your-email@example.com
    DocumentRoot /var/www/laravel-blog/public

    <Directory /var/www/laravel-blog/public>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/blog.example.dev-error.log
    CustomLog ${APACHE_LOG_DIR}/blog.example.dev-access.log combined
</VirtualHost>
  • 保存退出

3. 启用虚拟主机及必要模块

  • 启用刚才创建的虚拟主机:sudo a2ensite blog.example.dev.conf
  • 启用mod_rewrite模块(Laravel的路由重写全靠它):sudo a2enmod rewrite
  • 重启Apache服务让配置生效:sudo systemctl restart apache2

4. 修复Laravel目录权限(最容易忽略的点!)

Laravel需要对storage和bootstrap/cache目录有写入权限,否则会出现500错误:

  • 把项目目录的所有者改成Apache的运行用户:sudo chown -R www-data:www-data /var/www/laravel-blog
  • 设置目录权限:sudo chmod -R 775 /var/www/laravel-blog/storage /var/www/laravel-blog/bootstrap/cache

三、Laravel内部配置检查

1. .htaccess文件确认

Laravel的public目录下默认已经有.htaccess文件,不需要额外修改,只要你在Apache配置里开了AllowOverride All(步骤2里已经设置)就行。如果你的public目录里没有这个文件,直接用下面的内容创建一份:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

2. 子域名路由验证

确保你的routes/web.php里的子域名路由配置正确,比如:

Route::domain('blog.example.dev')->group(function () {
    Route::get('/', function () {
        return '欢迎访问博客子域名!';
    });
    // 这里添加你的其他子域名路由
});

四、测试访问

现在关闭所有正在运行的php artisan serve进程,打开浏览器输入http://blog.example.dev,应该就能看到你的Laravel子域名页面了!

五、如果还是访问不了?试试这些排查步骤

  1. 检查Apache是否正常运行:sudo systemctl status apache2,看输出里有没有active (running)
  2. 查看Apache错误日志找线索:cat /var/log/apache2/blog.example.dev-error.log,日志会告诉你具体是权限问题、路径错误还是其他问题
  3. 测试域名解析:在终端运行ping blog.example.dev,如果返回的不是127.0.0.1,说明hosts配置没生效
  4. 检查80端口是否被占用:sudo lsof -i :80,如果有其他服务(比如Nginx)在占用,先停止它再重启Apache

内容的提问来源于stack exchange,提问作者Rajesh Paudel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:49:14