在 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
包含一个文件 与第二个 nginxserver
配置块级别,即 被标准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.conf
为server
块的任何扩展添加.platform/nginx/conf.d/elasticbeanstalk/your_conf.conf
(或嵌套在其中)
【讨论】:
以上是关于在 Beanstalk 上扩展 Nginx 配置不会正确重写 url的主要内容,如果未能解决你的问题,请参考以下文章
在 Elastic Beanstalk 上使用 Nginx 在子域上配置 Laravel
Yii2 Nginx Elastic Beanstalk 上的高级模板
如何在 AWS Elastic Beanstalk 上修改 Nginx 配置