laravel - 在 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
而不是重写。
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
因为我试图在公众视野中隐藏它的脸而生气吗?
解决方案
解决方案从问题转移到答案:
我给了它一个周末,看看是否有人会知道并回去工作。
我做的第一件事是查看 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
所以这里有两种解决方案;
nginx.conf
通过在您的项目中包含一个新的来覆盖整个.platform/nginx/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 配置- 添加
.platform/nginx/conf.d/your_conf.conf
到http
块的任何扩展.platform/nginx/conf.d/elasticbeanstalk/your_conf.conf
为块的任何扩展添加server
(或嵌套在其中)
推荐阅读
- android - 显示的启动画面标志质量很差
- javascript - 选择器表单,关于提交如何使用 jQuery 或 JS 将 WordPress 查询变量发送到 URL
- javascript - Node.js 在服务中使用 res 和 req
- sql - ID和PK用什么
- c++builder - 如何将 SQL 查询中的值存储到 ComboBox 组件中?
- typo3 - Typo3 后端图像裁剪/操作工具在从 7 LTS 升级到 8 LTS 后不再工作
- ios - 如何在按钮操作上从 UIView 移动到 UIViewcontroller
- operating-system - 为什么在启用 Direct I/O 模式的 glusterFS 中读取速度非常低?
- gradle - Gradle-plugins : 我怎么知道 Gradle 支持的插件版本
- mysql - 如果从另一个模型创建新对象,Django 在模型上添加新字段