我正在尝试将一个子目录redirect到一个PHP文件。 它不是提供文件,而是下载它,这意味着它不会读取它作为一个PHP文件。
更确切的说,它不会进入fastcgi location ~ \.php$指令。
一些有趣的事实:
admin团队,但不是login块。 location ~ \.php$指令移动到login之上时,我将^~ /login改成~ /login ,这对于重写规则rewrite ^/login/(.+\.php)$ /$1 last; /(。+ rewrite ^/login/(.+\.php)$ /$1 last; 。 我没有阅读关于该主题的Wiki Nginx文档,所以我知道nginx读取位置指令的优先级,但是并不告诉我如何处理这种情况! 我也读过
这是configuration:
server { listen 80; server_name tyba-one.com *.tyba-one.com; root /var/www/tyba/public_html; rewrite_log on; error_page 404 /404.php; client_max_body_size 4M; if ($host ~* ^www\.(.*)){ set $host_without_www $1; rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent; } location = / { rewrite ^/$ /index.php last; } location ^~ /login { rewrite ^(/login)$ $1/ permanent; rewrite ^/login/$ /login.php last; rewrite ^/login/(.+\.php)$ /$1 last; } location ^~ /admin { rewrite ^(/admin)$ $1/ permanent; rewrite ^/admin/$ /page_builder.php last; rewrite ^/admin/(.+\.php)$ /$1 last; } location ~ \.php$ { try_files $uri =404; include /opt/nginx/conf/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/tyba/public_html$fastcgi_script_name; } }
我想了解正在发生的事情以及如何处理这种情况。
nginx只在每个嵌套级别处理一个位置块,所以/login.php由^~ /login块处理,而不是~ \.php$块。 由于您的位置块中只有重写语句,因此实际上根本不需要位置块(只要重写匹配具有足够的特定性即可)。 只要将你的重写语句移动到server块的根目录,以便/login和/admin请求仍然使用\.php$ location块:
rewrite ^/$ /index.php last; rewrite ^(/login)$ $1/ permanent; rewrite ^/login/$ /login.php last; rewrite ^/login/(.+\.php)$ /$1 last; rewrite ^(/admin)$ $1/ permanent; rewrite ^/admin/$ /page_builder.php last; rewrite ^/admin/(.+\.php)$ /$1 last; location ~ \.php$ { ... }