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

时间:2012-04-12 11:29:20

标签: nginx rewrite

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

本网站的.htaccess文件如下

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

将www.example.com/hello重定向到www.example.com/hello.php,保留原始链接,但在网址末尾省略.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和重写一起工作?

由于

2 个答案:

答案 0 :(得分:0)

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

我的意思是你的重写规则明确规定,如果你收到/ [a-z] +的请求,那么它应该被重写为/ [a-z] +。php

但是你想要一个try_files来推送/ admin到/ admin /而不是吗?

看看你的apache规则:

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

我在这里看到您正在尝试限制发送到x.php的内容。我在你的nginx重写中没有看到任何这样的限制。

答案 1 :(得分: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 < / p>

相关问题