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
替换为应处理此类请求的文件的真实路径。
我使用 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
.
要让 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
替换为应处理此类请求的文件的真实路径。