Nginx重写路径查询字符串

时间:2015-09-19 12:03:30

标签: php nginx url-rewriting

我使用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 个答案:

答案 0 :(得分:1)

解决方案#1:

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

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

fastcgi_pass 127.0.0.1:9000;

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

解决方案#2:

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

要让URI在/page/开始时使用Nginx,你应该写一个新的location,内容几乎相同({1}}行除外)和(重要!)把它放在现有的SCRIPT_FILENAME位置之前。

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

location

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

  • 如果URI以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; } 开头,则Nginx将运行/page/
  • 如果URI以/var/www/$main_host/www/path/to/file.php结尾,Nginx将像往常一样运行请求的php文件。

解决方案#3:

保留.php位置,并在之前放置以下位置

\.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; } 替换为应处理此类请求的文件的实际路径。