Nginx和处理文件没有扩展名

Ass*_*hko 5 nginx

我试图让Nginx处理没有扩展名的php文件(即处理http:// localhost/sample的方式与处理http://localhost/sample.php的方式相同).

这是我的网站配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;

    root /var/www;
    index index.html index.php;

    location ~ \.(hh|php)$ {
        fastcgi_keep_conn on;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location / {
        try_files $uri $uri/ $uri.html @extensionless =404;
    }

    location @extensionless {
        rewrite ^(.*)$ $1.php last;
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知它应该做的伎俩.但是 - 它没有.尝试http:// localhost/sample只是让我到404页面(而http://localhost/sample.php工作正常).

打开调试时,我在日志中看到以下内容:

2015/07/19 15:37:00 [debug] 4783#0: *1 http script var: "/sample"
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "/sample" "/var/www/sample"
2015/07/19 15:37:00 [debug] 4783#0: *1 http script var: "/sample"
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use dir: "/sample" "/var/www/sample"
2015/07/19 15:37:00 [debug] 4783#0: *1 http script var: "/sample"
2015/07/19 15:37:00 [debug] 4783#0: *1 http script copy: ".html"
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "/sample.html" "/var/www/sample.html"
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "@extensionless" "/var/www@extensionless"
2015/07/19 15:37:00 [debug] 4783#0: *1 trying to use file: "=404" "/var/www=404"
Run Code Online (Sandbox Code Playgroud)

这很奇怪.它基本上看起来像@extensionless被视为纯文件名(而不是导致重写URL的位置).

我错过了什么?:) 谢谢!

Ass*_*hko 7

只是更新(如果有人发现这个有用)我最终会让它工作.

这是诀窍的配置:

server {
    listen 80;

    root /var/www;
    index index.html index.htm index.php;

    server_name localhost;

    location / {
        if (!-e $request_filename){
            rewrite ^(.*)$ /$1.php;
        }
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
Run Code Online (Sandbox Code Playgroud)


cns*_*nst 5

    try_files $uri $uri/ $uri.html @extensionless =404;
Run Code Online (Sandbox Code Playgroud)

是的,@extensionless是对待像一个正常的文件,那是因为你需要添加额外的=404后@extensionless内try_files-的@extensionless部分将只作为内部重定向到另一个上下文中的最后一个参数的工作。

如果您不仅希望支持不.php带的处理请求,而且还.php希望剥离所有请求,则可能需要执行以下操作:

location / {
    if (-e $request_filename.php){
        rewrite ^/(.*)$ /$1.php;
    }
}
location ~ \.php$ {
    if ($request_uri ~ ^/([^?]*)\.php(\?.*)?$) {
        return 302 /$1$2;
    }
    fastcgi_...
}
Run Code Online (Sandbox Code Playgroud)