当前位置: 首页 > 知识库问答 >
问题:

使用nginx的每个路由上的NotFoundHttpException

胡和煦
2023-03-14

我尝试将nginx配置为动态处理所有/{{app}}/query请求,以访问laravel应用程序,如下所示:

server {
    listen       80;
    server_name  localhost;
    root   /usr/share/nginx/apps;

    location / {
        index index.php;
        try_files $uri @rewriteapp;
    }

    location @rewriteapp {
        rewrite ^/([^/]+)(.*)$ /$1/public/index.php?$2 last;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

目前,nginx将我的请求路由到正确的目录和文件。例如:

www.domain.com/test/item/1/edit

...路线:

/path/to/my/apps/test/public/index.php?/item/1/edit

我还可以回显var_export($_GET)并查看该查询:

array(
    '/item/1/edit' => '',
)

但拉拉维尔·艾尔维斯说:

NotFoundHttpException in RouteCollection.php line 161:
in RouteCollection.php line 161
at RouteCollection->match(object(Request)) in Router.php line 823
at Router->findRoute(object(Request)) in Router.php line 691
at Router->dispatchToRoute(object(Request)) in Router.php line 675
at Router->dispatch(object(Request)) in Kernel.php line 246
at Kernel->Illuminate\Foundation\Http\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 52
at Pipeline->Illuminate\Routing\{closure}(object(Request)) in CheckForMaintenanceMode.php line 44
at CheckForMaintenanceMode->handle(object(Request), object(Closure))
at call_user_func_array(array(object(CheckForMaintenanceMode), 'handle'), array(object(Request), object(Closure))) in Pipeline.php line 136
at Pipeline->Illuminate\Pipeline\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 32
at Pipeline->Illuminate\Routing\{closure}(object(Request))
at call_user_func(object(Closure), object(Request)) in Pipeline.php line 102
at Pipeline->then(object(Closure)) in Kernel.php line 132
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 99
at Kernel->handle(object(Request)) in index.php line 57

但是为什么呢?

路线看起来像这样:

Route::get('/', function () {
    return view('welcome');
});

Route::get('/item', function() {
    return 'Item';
});

php artisan路由:列表返回:

+--------+----------+---------+------+---------+------------+
| Domain | Method   | URI     | Name | Action  | Middleware |
+--------+----------+---------+------+---------+------------+
|        | GET|HEAD | /       |      | Closure | web        |
|        | GET|HEAD | item    |      | Closure | web        |
+--------+----------+---------+------+---------+------------+

我的Laravel版本是5.2.33我使用Ubuntu 16.04服务器与PHP 7.0.6(PHP-FPM)作为主机。

这是nginx配置问题吗?还是拉威尔的问题?或者它是一个Linux,也许是与权限相关的主题?

共有2个答案

龚奇逸
2023-03-14

经过一些研究和尝试,我找到了以下解决方案:

server {

    listen       80;
    server_name  localhost;

    location = / {

        # redirect if no app is specified
        return 301 http://www.domain.com; 
    }

    location ~* ^/([^/]+)(.*)\.(jpe?g|png|svg|gif|ico|doc|docx|xls|xlsx|pdf|txt)$ {

        # handle static files
        alias /usr/share/nginx/apps/$1/public$2.$3;
    }

    location ~* ^/([^/]+)(.*)$ {

        # handle laravel requests
        root /usr/share/nginx/apps/$1/public;

        try_files /index.php =404;

        include         fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_param   REQUEST_URI  $2;
        fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    }
}
西门凯康
2023-03-14

将应用程序根指向公用文件夹,它将正常工作

 类似资料:
  • 我使用React js创建了一个站点,并对Nginx进行了一些更改,以将路由重写为文件,这样就不会出现404错误。最近,如果我使用location/{try_files$uri$uri//index.html;}为单页应用程序购买配置Nginx,我尝试使用express on当我尝试访问/api时,我将从我的应用程序中获取notFound页面,如果我不配置它,我可以访问我的express服务器,但

  • React路由的使用 使用React路由之前,我们需要先安装 react-router-dom这个包。比如: yarn add react-router-dom 代码举例: (1)index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="

  • 为了定义辅助路由,我们必须首先添加一个命名的路由出口,其中要呈现辅助路由的内容。 接下来,我们必须定义到应用程序的辅助路由的链接,以导航和呈现内容。 每个辅助路由是独立的路由,可以拥有: 自己的辅助路由 自己的浏览器历史记录栈

  • 将路由链接到参数 显示特定产品详细信息的组件的路由需要该产品ID的路由参数。我们可以使用以下实现: 注意:product-details路由的路径中的 ,它将参数放在路径中。例如,要查看ID为5的产品的产品详细信息页面,必须使用以下URL:localhost:3000/product-details/5 注意,指令传递一个数组,该数组指定路径和路由参数。或者,我们可以使用JS跳转: Product

  • 问题内容: 我正在使用Express v4.13.4开发Node v4.2.4应用程序。现在,我想增加特定上传路由的超时时间。 根据我的阅读和经验: 默认的节点服务器超时为2分钟 默认情况下,节点套接字没有超时 Express提供了中间件来处理超时 但是,当尝试为上载路由实现连接超时中间件时,我迷路了。 应用设置 上传路线定义 但是,当我上传文件时,仅在命令行控制台上3分钟后我才看到错误。该请求仍

  • 由于在 StackOverflow 上已经有很多关于这个问题的问题,我首先要确保这不是重复和区分。 这是关于 在 2 个不同的身份验证 管理器中具有 2(或更多)不同的身份验证提供程序,以用于不同的路由。 使用 Spring Security 5.5 而不是 3.x 中的方法 使用基于非 XML 配置的方法 所以问题不在于: 如何在身份验证管理器中包含多个身份验证以提供“替代身份验证”(大多数问题