【问题标题】:Nginx rewrite path to query stringNginx 重写查询字符串的路径
【发布时间】:2015-09-20 00:25:42
【问题描述】:

我使用 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时如何编写规则以忽略任何符号?

【问题讨论】:

  • 使用另一个 location 块,例如 location ~ /page/

标签: php nginx url-rewriting


【解决方案1】:

解决方案 #1:

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

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

fastcgi_pass 127.0.0.1:9000;

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

解决方案 #2:

只有当 URI 以 .php 结尾时,您当前的配置才会使 Nginx 将请求传递给 PHP-FPM。

要让 Nginx 在 URI 以 /page/ 开头时也这样做,你应该写一个新的 location 几乎相同的内容(SCRIPT_FILENAME 行除外)并且(重要!)把它放在现有的 @987654329 之前@位置。

复制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;
}

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

  • 如果 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 替换为应处理此类请求的文件的真实路径即可。

【讨论】:

  • 感谢您的回答。当我将fastcgi_pass 放入任何位置时,我看到一个错误:nginx: [emerg] "fastcgi_pass" directive is duplicate in /etc/nginx/conf.d/fastcgi_params.conf: nginx: configuration file /etc/nginx/nginx.conf test failed
  • @Ockonal 你还有其他locations 以及你在问题中发布的那两个吗?
  • @Ockonal 看看解决方案 3
  • 谢谢,它在以下情况下有效:http://example.com/page/foo/bar 但在以下情况下失败:http://example.com/page/foo/bar.html (404)
  • @Ockonal 在我发布之前似乎还有另一个location,它拦截了.html 请求。如果是这样,您可以尝试将^/page/ 位置放在任何其他location 之前
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2016-11-17
  • 2012-10-11
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多