重写 nginx conf

重写 nginx conf

我正在尝试使用重写模式编写我的 nginx conf,但目前它只能下载文件而不是使用 PHP 运行它。

我的目标是将所有内容重写到同一个文件,但使用不同的查询参数:

# If file exist (like images, assets, etc...), just use it
http://foo.local/css/style.css => css/style.css
http://foo.local/images/img.png => images/img.png

# For all other:
http://foo.local/foo                   =>  web/index.php?module=foo
http://foo.local/foo/bar          =>  web/index.php?module=foo&action=bar
http://foo.local/foo/bar/baz  =>  web/index.php?module=foo&action=bar&params=baz
server {
    listen 80;
    server_name foo.local;

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

    location / {
      try_files $uri $uri/ @rules;
    }

    location @rules {
      rewrite ^/([^/]*)$ /web/index.php?module=$1 break;
      rewrite ^/([^/]+)/([^/]+)/?$ /web/index.php?module=$1&action=$2 break;
      rewrite ^/([^/]+)/([^/]+)/([^/]+)/?$ /web/index.php?module=$1&action=$2&params=$3 break;
    }

    location /web/index\.php(/|$) {
        try_files $uri =404;
        fastcgi_pass  unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 256 4k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }
}

当我去http://foo.local/foo/bar/baz它只是下载我的index.php

你能帮我吗?谢谢

答案1

尝试在您的指令中使用rewrite ... last;而不是。意味着 nginx 开始搜索与改变的 URI 匹配的新位置,这意味着 nginx 应该找到您的位置。break;last/web/index...

此外:

location /web/index\.php(/|$)

可能不会达到您的预期。location默认情况下,块是前缀匹配,因此该位置仅匹配

/web/index\.php(/|$)...

字面上的前缀,以及带有此前缀的任何内容。

最有可能的是,你想要一个正则表达式匹配,它将是:

location ~ /web/index\.php(/|$)

另一种选择是使用正确的前缀匹配:

location /web/index.php

相关内容