Nginx重写规则/try\u文件不在一起工作

Nginx重写规则/try\u文件不在一起工作,nginx,rewrite,Nginx,Rewrite,我有一个网站,我需要从Apache服务器移动到Nginx服务器 本网站的.htaccess文件如下 RewriteEngine on RewriteRule ^([^/\.]+)/?$ $1.php [L] 这会将www.example.com/hello重定向到www.example.com/hello.php,保留原始链接,但在url末尾省略.php 我试图在我的Nginx服务器块中复制此功能 location / { # Check if a file exists, or route

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

本网站的.htaccess文件如下

RewriteEngine on
RewriteRule ^([^/\.]+)/?$ $1.php [L]
这会将www.example.com/hello重定向到www.example.com/hello.php,保留原始链接,但在url末尾省略.php

我试图在我的Nginx服务器块中复制此功能

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_文件应将此重定向到

www.example.com/admin/

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

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

有人知道我如何让try_文件和重写一起工作吗

谢谢


Ben

我知道这可能没有帮助,但我查看了您的用例,我想知道您如何知道对/admin的请求应该转到/admin/而不是/admin.php

我的意思是,您的重写规则明确规定,如果您收到对/[a-z]+的请求,那么应该将其重写为/[a-z]+.php

但是您想尝试将/admin文件推送到/admin/吗

查看您的apache规则:

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

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

您可以在location指令或服务器中将索引设置为index.php

index index.php index.html;
例如,前往/admin/index.php的请求将显示为/admin/

或者让try_文件尝试将.php放在请求的末尾

location / {
    try_files $uri $uri.php =404;
}

在这种情况下,您的/admin将不是一个文件夹,而是admin.php,但如果您还有一个名为/admin/的文件夹,则会变得很棘手,因为它将尝试/admin.php和/admin/index.php

找到解决方法或解决方案了吗?