我有以下 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;
}