在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子域名页面了!
五、如果还是访问不了?试试这些排查步骤
- 检查Apache是否正常运行:
sudo systemctl status apache2,看输出里有没有active (running) - 查看Apache错误日志找线索:
cat /var/log/apache2/blog.example.dev-error.log,日志会告诉你具体是权限问题、路径错误还是其他问题 - 测试域名解析:在终端运行
ping blog.example.dev,如果返回的不是127.0.0.1,说明hosts配置没生效 - 检查80端口是否被占用:
sudo lsof -i :80,如果有其他服务(比如Nginx)在占用,先停止它再重启Apache
内容的提问来源于stack exchange,提问作者Rajesh Paudel
相关产品推荐
相关产品推荐

