nginx 中的多级捕获所有 index.php

nginx 中的多级捕获所有 index.php

我有以下 nginx 配置:

server {
        listen 80 default_server;
        root /var/www;
        index index.php index.html index.htm;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires 24h;
                log_not_found off;
        }

        location ~ \.php$ {
                try_files $uri =404;

                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass 127.0.0.1:9000;
        }
}

当访问任何 URL 时,这将把所有内容传递到 /var/www/index.php。

但是,我希望任意第一级子目录中的 index.php 文件能够覆盖根 index.php 文件。即

http://example.com/-> /var/www/index.php
http://example.com/test-> /var/www/index.php
http://example.com/test/testing-> /var/www/index.php

如果/var/www/test/index.php 存在:

http://example.com/-> /var/www/index.php (未改变)
http://example.com/test-> /var/www/test/index.php
http://example.com/test/testing-> /var/www/test/index.php

我尝试了许多不同的正则表达式,但还是不知所措。有什么想法吗?在 Apache 中,使用 .htaccess 可以轻松解决,但这显然不是这里的选项。

答案1

location / {
    if (-e $request_filename) {
        break;
    }
    rewrite (.*/)([^\/]+) $1 last;

    try_files $uri $uri/;
}

改变最后的重定向用于外部重定向而不是内部重写。

答案2

基于的解决方案h0tw1r3 的,但没有 if:

location / {
        try_files $uri $uri/ $uri/index.php?$args @pop;
}

location @pop {
        rewrite (.*/)([^\/]+/?) $1 last;
}

相关内容