首页 > 解决方案 > 在 Beanstalk 上扩展 Nginx 配置不会正确重写 url

问题描述

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

我想要的是

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

我是如何做到这一点的

由于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 的文档,该文件应与项目一起上传并扩展nginx 配置。据我所知,它确实可以识别,因为任何拼写错误都会导致eb deploy. 我还可以在它已添加到的服务器上看到/etc/nginx/conf.d/proxy.conf.

问题

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

问题

标签: laravelamazon-web-servicesnginxurl-rewritingamazon-elastic-beanstalk

解决方案


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

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

我做的第一件事是查看 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配置块,它被Beanstalks 自己的配置的标准配置块server有效地覆盖。server

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

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

解决方案 2 认为 AWS 可以随时更新其默认的 nginx.conf,而无需您注意(除非他们更改了 elasticbeanstalk 配置的位置)。

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

这里的课;

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

推荐阅读