Nginx 重写查询字符串的路径

Nginx rewrite path to query string

我使用 nginx (php-fpm) 和 fatfree 框架。我的路由引擎中需要一些重定向逻辑。看起来像:

http://example.net/page/...

代替点可能是这样的:

another.net/someurl
http://another.net/?local_query
another.net/path/to/article.html

它破坏了 nginx 逻辑,我看到 404 错误。

我的 nginx 配置看起来很简单:

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

location ~ \.php$ {
    include             /etc/nginx/conf.d/fastcgi_params.conf;

    fastcgi_param       SCRIPT_FILENAME     /var/www/$main_host/www$fastcgi_script_name;
    fastcgi_param       DOCUMENT_ROOT       /var/www/$main_host/www;

    fastcgi_param       PHP_ADMIN_VALUE     upload_tmp_dir=/var/www/$main_host/tmp/upload;
    fastcgi_param       PHP_ADMIN_VALUE     session.save_path=/var/www/$main_host/tmp/sessions;
}

所以当我使用:

http://example.net/page/another.net/path/to/article.html

Nginx 尝试在文件系统中查找名称为 article.html 的文件,据我所知。当域后有关键字 page 时,如何编写规则以忽略任何符号?

解决方案#1:

可能它不起作用,因为 /etc/nginx/conf.d/fastcgi_params.conf 中没有 fastcgi_pass 指令。

如果是这样,您只需将其添加到您的 \.php$ 位置即可。在一般情况下,它看起来像:

fastcgi_pass 127.0.0.1:9000;

但这行可能会有所不同,具体取决于 PHP-FPM 的配置方式。

解决方案#2:

您当前的配置使 Nginx 仅在 URI 以 .php.

结尾时将请求传递给 PHP-FPM

要让 Nginx 在 URI 以 /page/ 开头时也这样做,你应该写一个新的 location 内容几乎相同(除了 SCRIPT_FILENAME 行)和(重要!) 将其放在现有 \.php$ 位置之前。

复制 location 内容会导致代码重复,我建议以稍微不同的方式编写配置:

fastcgi_param       SCRIPT_FILENAME     /var/www/$main_host/www$my_script_name;
fastcgi_param       DOCUMENT_ROOT       /var/www/$main_host/www;

fastcgi_param       PHP_ADMIN_VALUE     upload_tmp_dir=/var/www/$main_host/tmp/upload;
fastcgi_param       PHP_ADMIN_VALUE     session.save_path=/var/www/$main_host/tmp/sessions;
include             /etc/nginx/conf.d/fastcgi_params.conf;

location ~ /page/ {
    fastcgi_pass 127.0.0.1:9000;
    set $my_script_name /path/to/file.php;
}

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    set $my_script_name $fastcgi_script_name;
}

在这种情况下,您将有 2 种情况:

  • 如果 URI 以 /page/ 开头,Nginx 将 运行 /var/www/$main_host/www/path/to/file.php.
  • 如果 URI 以 .php 结尾,Nginx 将 运行 像往常一样请求 php 文件。

解决方案#3:

保持您的 \.php$ 位置不变,并将以下位置 放在 之前:

location ~ ^/page/ {
    include             /etc/nginx/conf.d/fastcgi_params.conf;

    fastcgi_param       SCRIPT_FILENAME     /var/www/$main_host/www/path/to/file.php;
    fastcgi_param       DOCUMENT_ROOT       /var/www/$main_host/www;

    fastcgi_param       PHP_ADMIN_VALUE     upload_tmp_dir=/var/www/$main_host/tmp/upload;
    fastcgi_param       PHP_ADMIN_VALUE     session.save_path=/var/www/$main_host/tmp/sessions;
}

只需将 /path/to/file.php 替换为应处理此类请求的文件的真实路径。