Laravel 5.5 主域名指向public目录后链接失效问题求助
解决Laravel部署后链接失效的问题
这是部署路径变更后常见的URL解析错误问题,主要和配置、URL生成方式有关,我给你一步步拆解解决方案:
1. 修正.env里的APP_URL配置
当你把域名直接指向commerce/public后,项目根URL已经从domain.com/commerce/public变成了domain.com,但Laravel的配置可能还停留在旧路径:
- 找到项目根目录下的
.env文件,修改APP_URL为你的域名:APP_URL=https://domain.com - 运行以下命令清除配置缓存,让新配置生效:
php artisan config:cache
2. 用Laravel路由辅助函数生成正确的Ajax URL
你现在Ajax里直接写了相对路径'get-item-sizes-detail',这种写法在页面URL层级变化时(比如访问domain.com/product/xxx),会导致浏览器错误解析路径,出现你看到的奇怪拼接结果。正确的做法是用Laravel的路由系统生成绝对URL:
步骤1:给路由命名
修改你的路由定义,加上名称:
Route::post('/get-item-sizes-detail', 'ProductController@getItemSizesDetail')->name('product.get-sizes');
步骤2:在Ajax中使用命名路由生成URL
如果你的Ajax代码写在Blade模板里,直接用route()辅助函数:
url: "{{ route('product.get-sizes') }}", type: "POST", // 其他参数...
如果你的Ajax代码在单独的JS文件里(无法直接用Blade语法),可以在Blade模板的<head>里定义一个全局基础URL变量:
<script> window.baseUrl = "{{ url('/') }}"; </script>
然后在JS文件里这样用:
url: window.baseUrl + '/get-item-sizes-detail', type: "POST", // 其他参数...
3. 验证服务器重写规则
确保public目录下的.htaccess(Apache)或者Nginx配置正确,保证所有请求都转发到index.php:
Apache的.htaccess示例(Laravel默认)
<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>
Nginx配置示例
server { listen 80; server_name domain.com; root /path/to/commerce/public; add_header X-Frame-Options "SAMEORIGIN"; add_header X-Content-Type-Options "nosniff"; index index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } error_page 404 /index.php; location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 根据你的PHP版本调整 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } location ~ /\.(?!well-known).* { deny all; } }
4. 清除路由缓存
如果之前生成过路由缓存,运行以下命令清除:
php artisan route:clear
如果需要重新生成缓存,再运行:
php artisan route:cache
做完这些步骤后,重新访问domain.com测试Ajax请求,应该就能正常指向正确的URL了。
内容的提问来源于stack exchange,提问作者CairoCoder
相关产品推荐
相关产品推荐

