在 Beanstalk 上扩展 Nginx 配置不会正确重写 url

Posted

技术标签:

【中文标题】在 Beanstalk 上扩展 Nginx 配置不会正确重写 url【英文标题】:Extending Nginx config on Beanstalk doesn't rewrite urls properly 【发布时间】:2021-05-16 08:19:45 【问题描述】:

我有一个在 Beanstalk 上运行的现有 Laravel API 应用程序。它在 EBS 上的更新一直滞后,所以目前我正在升级这个应用程序的平台和 CI/CD。我还遇到了一个问题,这让我在“但它应该工作”级别上摸不着头脑。

我想要什么

所有包含 https://example.com/index.php/endpoint 的 URL 将被重定向到 https://example.com/endpoint 并显示与 https://example.com/index.php/endpoint 相同的内容(包括 URL 的后缀)

我是如何做到这一点的

由于this wonderful answer by cnst,我的以下配置似乎适用于许多人(包括其他一些在线资源)。

server
    index index.php;

    if ($request_uri ~* "^(.*/)index\.php/*(.*)$") 
        return 301 $1$2;
    

    location / 
        try_files $uri $uri/ /index.php?$query_string;

        # Remove from everywhere index.php
        if ($request_uri ~* "^(.*/)index\.php(/?)(.*)") 
            return 301 $1$3;
        
    

    if (!-d $request_filename) 
        rewrite ^/(.+)/$ /$1 permanent;
    

    if ($request_uri ~* "\/\/") 
        rewrite ^/(.*) /$1 permanent;
    

我将此配置放在位于my_project/.platform/nginx/conf.d/proxy.conf 的文件中,根据AWS' documentation,该文件应与项目一起上传并扩展 nginx 配置。据我所知,它确实可以识别它,因为任何拼写错误都会在eb deploy 之后导致错误。我还可以在服务器上看到它已添加到/etc/nginx/conf.d/proxy.conf

问题

即使正在部署扩展的 proxy.conf 并且其中的配置似乎已被拾取,应用程序也不会拾取重写并让应用程序 URL 以 index.php 运行而不是重写。

https://example.com/index.php/endpoint → 有效 https://example.com/endpoint → 导致服务器生成 404 Nginx 日志显示 2021/02/12 14:23:24 [error] 7523#0: *35 open() "/var/www/html/public/api" failed (2: No such file or directory),它告诉我它已经搜索了一个文件并且从未尝试通过 index.php 运行它。

问题

我的配置中缺少什么? 或者是我忽略或误解了 EBS 的问题? index.php 是不是很生气,因为我想把它的脸藏起来不让公众看到?

【问题讨论】:

【参考方案1】:

解决方案从问题转移到答案:

我给了它一个周末,看看是否有人会知道并回去工作。

我做的第一件事就是看看 Beanstalk 是否捡到了任何 配置,所以我放了一个无效的变量,看看是否会 破坏服务器。它没有...

其次,我检查了我的 Beanstalk 实例是否真的在使用 Nginx (默认)或出于某种原因切换到 Apache (httpd)(它包括 两个都)。通过它的 GUI 配置,我可以很容易地判断它是 Nginx。

第三,我查看了服务器上的nginx.conf 并检查了其他 .conf 文件被包括在内。部分可见这里;

http 
    [...]
    include       conf.d/*.conf;

    map $http_upgrade $connection_upgrade 
        [...]
    

    server 
        listen        80 default_server;
        access_log    /var/log/nginx/access.log main;

        [...]

        # Include the Elastic Beanstalk generated locations
        include conf.d/elasticbeanstalk/*.conf;
   

这就是问题所在;我在conf.d/*.conf 包含一个文件 与第二个 nginx server 配置块级别,即 被标准server 配置块有效覆盖 通过 Beanstalks 自己的配置。

所以这里有两种解决方案;

    通过在您的项目中包含一个新的.platform/nginx/nginx.conf 来覆盖整个nginx.conf,您可以在其中扩展 使用您自己的配置的服务器块 或者,在我看来,更优雅的是,将.platform/nginx/elasticbeanstalk/proxy.conf 添加到您的项目中, 专门扩展 server 块(但删除任何 server 来自您自己的配置的块)

解决方案 2 将确保 AWS 始终可以更新其默认的 nginx.conf 无需您注意(除非他们更改 elasticbeanstalk 配置的位置)。

我确实尝试将我的配置放入 .platform/nginx/elasticbeanstalk/proxy.conf 之前,但那会 破坏服务器,因为我包含了一个 server 块,导致它 双重嵌套。

在这里上课;

添加 .platform/nginx/nginx.conf 以覆盖整个 Beanstalk Nginx 配置 为http 块的任何扩展添加.platform/nginx/conf.d/your_conf.confserver 块的任何扩展添加.platform/nginx/conf.d/elasticbeanstalk/your_conf.conf(或嵌套在其中)

【讨论】:

以上是关于在 Beanstalk 上扩展 Nginx 配置不会正确重写 url的主要内容,如果未能解决你的问题,请参考以下文章

aws弹性beantalk上的nginx扩展

在 Elastic Beanstalk 上使用 Nginx 在子域上配置 Laravel

Yii2 Nginx Elastic Beanstalk 上的高级模板

如何在 AWS Elastic Beanstalk 上修改 Nginx 配置

AWS Beanstalk - nginx 强制 SSL 配置更改后,Worker env 不处理后台作业

如何在部署应用程序 Elastic beanstalk 上修改 NGINX 配置