nginx 重写为 index.php?q=$uri

nginx rewrite to index.php?q=$uri

我必须更新 nginx 主机,以便将对别名的所有请求都重写为 /alias_path/index.php?q=$uri。但是现在所有的资产都没有了

这是我当前的配置。我越来越近了,但是当我取消对最后一个位置的注释时,资产不再可用。

    location /csv-import {
            alias /var/www/csv-import/public;

            location ~ \.php$ {
                    include snippets/fastcgi-php.conf;
                    fastcgi_param  SCRIPT_FILENAME        $request_filename;
                    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            }

            try_files $uri $uri/ =404;

            #location ~ ^/csv-import/(.*)$ {
                    #alias /var/www/csv-import/public;
                    #try_files $uri $uri/ /csv-import/index.php?q=;
            #}

            error_log /var/log/nginx/csv-import.error.log;
            access_log /var/log/nginx/csv-import.access.log;
    }

我不想访问的文件是 /var/www/csv-import/public/index.phpexample.com/csv-import/some/url 等所有网址都应重写为 example.com/csv-import/index.php?q=some/url,但 example.com/csv-import/css/app.css 等资产应在 /var/www/csv-import/public/css/app.css.

下可用

我确信有一个完美的解决方案,但我想不出来。

您不需要另一个 location 块。通常的方法是更改​​ try_files 语句的默认操作。但是因为 this issue,一个 if 块可能更简单:

location ^~ /csv-import {
    alias /var/www/csv-import/public;

    if (!-e $request_filename) {
        rewrite ^/csv-import/(.*)$ /csv-import/index.php?q= last;
    }

    location ~ \.php$ {
        ...
    }

    error_log /var/log/nginx/csv-import.error.log;
    access_log /var/log/nginx/csv-import.access.log;
}

if 块替换了 try_files 语句。 ^~ 运算符在使用 if.

时避免了与其他 location blocks. See this caution 的任何歧义