Nginx 重写规则/try_files 不能一起工作

标签 nginx rewrite

我有一个网站需要从 Apache 服务器迁移到 Nginx 服务器。

本站.htaccess文件如下

RewriteEngine on
RewriteRule ^([^/\.]+)/?$ $1.php [L]

这会将 www.example.com/hello 重定向到 www.example.com/hello.php,保留原始链接,但从 url 末尾省略 .php。

我试图在我的 Nginx 服务器 block 中复制它..

location / {
# Check if a file exists, or route it to index.php.
        try_files $uri $uri/ /index.php;
}

rewrite ^/([a-z]+)$ /$1.php last;

重写规则有效,将所有链接重定向到 .php 文件,但如果文件不存在,则打破 Nginx try_files 在目录内搜索的规则。

下面的管理示例链接是一个文件夹,里面有一个 index.php 文件。

www.example.com/admin

try_files 应该将其重定向到..

www.example.com/admin/

因为没有名为 admin.php 的文件。相反,我收到“未指定输入文件”消息。

当我删除重写时,try_files 工作正常。但是,如果没有此重写规则,站点的其余部分将无法工作。

有谁知道如何让 try_files 和重写一起工作?

谢谢

最佳答案

我知道这可能没有帮助,但我看了你的用例,我想知道你怎么知道/admin 的请求应该去/admin/而不是/admin.php?

我的意思是您的重写规则清楚地表明,如果您收到对/[a-z]+ 的请求,则应将其重写为/[a-z]+.php

但是你想要一个 try_files 将/admin 推送到/admin/吗?

查看您的 apache 规则:

RewriteRule ^([^/\.]+)/?$ $1.php [L]

我在这里看到您试图限制发送到 x.php 的内容。我在您的 nginx 重写中没有看到任何此类限制。

关于Nginx 重写规则/try_files 不能一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10122640/

相关文章:

nginx - 创建对 minio 存储的公共(public)访问

amazon-web-services - Nginx 400,使用 nginx-ingress Controller 将普通的 http 响应发送到 HTTPS 端口

apache - 选项FollowSymLinks和SymLinksIfOwnerMatch已关闭

url - 通过 IIS URL 重写模块删除 URL 的特定部分

c# - 如何删除文本文件的前 "X"行?

url - 如何将我的 url 从 index.php 重写为 sample.php

javascript - 保存后JavaScript中的隐藏字符

node.js - 在 Express 中处理重定向以支持 nginx 反向代理

nginx - 配置nginx反向代理进行mqtt通信

.htaccess - 将页面从旧站点重定向到新站点 - 一个接一个