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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:57