3

我有一个网站需要从 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_files 应该将其重定向到..

www.example.com/admin/

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

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

有谁知道我怎样才能让 try_files 和 rewrite 一起工作?

谢谢

4

2 回答 2

0

我知道这可能无济于事,但是我查看了您的用例,我想知道您如何知道对 /admin 的请求应该转到 /admin/ 而不是 /admin.php?

我的意思是您的重写规则明确指出,如果您收到对 /[az]+ 的请求,则应将其重写为 /[az]+.php

然而,您希望 try_files 将 /admin 推送到 /admin/ 吗?

查看您的 apache 规则:

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

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

于 2017-09-29T11:29:36.813 回答
0

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

index index.php index.html;

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

或者让 try_files 尝试将 .php 放在请求的末尾

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

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

于 2019-01-05T17:18:07.873 回答