Nginx 配置 - 在非常自定义的设置中将路由传递给 index.php
Nginx Configuration - Passing route to index.php on a very custom setup
有些事情告诉我,我从一开始就采用的方法是错误的,这让我很难解决这个新问题...但是我们开始吧!
设置
location ~ ^/dev/([^\/]+?)\/(.*) {
alias /opt/dev//www/;
autoindex on;
# PHP location check for personal dev environments
location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root;
fastcgi_param PHP_VALUE error_log=/opt/dev//logs/php_errors.log;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
}
上面的这个设置允许我的开发人员每个人都有自己的个人开发环境。转到:http://site_url/dev/[user]/[project]/ 工作正常,如果该项目目录中有 php 个文件,这些文件在本地位于 /opt/dev/[user]/www/[project ]/ 目录。仅这一点就让我花了很多时间来弄清楚,但现在我们有一个新的困境,它已经连续 8 个小时让我烦恼了。
注意:正则表达式是我在编程方面的弱点,所以 nginx 配置这些东西是基于正则表达式的事实让我很伤心
问题
我需要能够检测到超出 [project] 级别的路径何时无法访问,然后将该请求重定向到项目级别的 index.php,使用路由参数,以便我们可以处理它在 php 级别。
例如:
http://site_url/dev/[user]/[project]/something/else/
如果目录/opt/dev/[用户]/www/[项目]/something/else不存在(或者没有php文件),我需要去 /opt/dev/[user]/www/[project]/index.php 的请求,但我也想打电话index.php 带有一个 "route" 参数,它给出 url 的其余部分。
(即:index.php?route=something/else)
我希望这是有道理的,我真的希望有人能在这里帮助我。
我承认这可能意味着完全改变我的配置,但我不在乎,只要它有效。
完整来源
这是我从上到下的整个配置文件:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www;
index index.php index.html index.htm index.nginx-debian.html;
server_name 192.168.20.200;
location / {
try_files $uri $uri/ =404;
}
location ~ ^/dev/([^\/]+?)\/(.*) {
alias /opt/dev//www/;
autoindex on;
# PHP location check for personal dev environments
location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root;
fastcgi_param PHP_VALUE error_log=/opt/dev//logs/php_errors.log;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht {
deny all;
}
}
听起来您正在尝试做的是 try_files
如果文件存在则提供文件,如果不存在则尝试下一个。这样的事情应该可行,我正在使用第三个正则表达式块来捕获您的路由变量,我将其传递给 headers.
location ~ ^/dev/(\w+)\/((?1))(.*) {
root /opt;
autoindex on;
add_header x-route ;
try_files /dev//www//index.php /dev//www/.php /dev//www// /dev//www//index.php =404;
Nginx 现在将尝试处理您对 /dev/[user]/www/[project]/something/else 的请求,如下所示:
先试试/opt/dev/[user]/www/[project]/something/else/index.php
下次试试/opt/dev/[user]/www/[project]/something/else.php
接下来尝试显示 /opt/dev/[user]/www/[project]/something/else/
的索引
接下来尝试退回到 /opt/dev/[user]/www/[project]/index.php
在您的 PHP 脚本中 $_SERVER['HTTP_X_ROUTE']
的值将是“/something/else”
最后,如果 none 这些工作 return 404。
有些事情告诉我,我从一开始就采用的方法是错误的,这让我很难解决这个新问题...但是我们开始吧!
设置
location ~ ^/dev/([^\/]+?)\/(.*) {
alias /opt/dev//www/;
autoindex on;
# PHP location check for personal dev environments
location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root;
fastcgi_param PHP_VALUE error_log=/opt/dev//logs/php_errors.log;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
}
上面的这个设置允许我的开发人员每个人都有自己的个人开发环境。转到:http://site_url/dev/[user]/[project]/ 工作正常,如果该项目目录中有 php 个文件,这些文件在本地位于 /opt/dev/[user]/www/[project ]/ 目录。仅这一点就让我花了很多时间来弄清楚,但现在我们有一个新的困境,它已经连续 8 个小时让我烦恼了。
注意:正则表达式是我在编程方面的弱点,所以 nginx 配置这些东西是基于正则表达式的事实让我很伤心
问题
我需要能够检测到超出 [project] 级别的路径何时无法访问,然后将该请求重定向到项目级别的 index.php,使用路由参数,以便我们可以处理它在 php 级别。
例如:
http://site_url/dev/[user]/[project]/something/else/
如果目录/opt/dev/[用户]/www/[项目]/something/else不存在(或者没有php文件),我需要去 /opt/dev/[user]/www/[project]/index.php 的请求,但我也想打电话index.php 带有一个 "route" 参数,它给出 url 的其余部分。
(即:index.php?route=something/else)
我希望这是有道理的,我真的希望有人能在这里帮助我。 我承认这可能意味着完全改变我的配置,但我不在乎,只要它有效。
完整来源
这是我从上到下的整个配置文件:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www;
index index.php index.html index.htm index.nginx-debian.html;
server_name 192.168.20.200;
location / {
try_files $uri $uri/ =404;
}
location ~ ^/dev/([^\/]+?)\/(.*) {
alias /opt/dev//www/;
autoindex on;
# PHP location check for personal dev environments
location ~ ^/dev/([^\/]+?)\/([^\/].+\/|)(.+\.php)$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root;
fastcgi_param PHP_VALUE error_log=/opt/dev//logs/php_errors.log;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
location ~ /\.ht {
deny all;
}
}
听起来您正在尝试做的是 try_files
如果文件存在则提供文件,如果不存在则尝试下一个。这样的事情应该可行,我正在使用第三个正则表达式块来捕获您的路由变量,我将其传递给 headers.
location ~ ^/dev/(\w+)\/((?1))(.*) {
root /opt;
autoindex on;
add_header x-route ;
try_files /dev//www//index.php /dev//www/.php /dev//www// /dev//www//index.php =404;
Nginx 现在将尝试处理您对 /dev/[user]/www/[project]/something/else 的请求,如下所示:
先试试/opt/dev/[user]/www/[project]/something/else/index.php
下次试试/opt/dev/[user]/www/[project]/something/else.php
接下来尝试显示 /opt/dev/[user]/www/[project]/something/else/
接下来尝试退回到 /opt/dev/[user]/www/[project]/index.php
在您的 PHP 脚本中 $_SERVER['HTTP_X_ROUTE']
的值将是“/something/else”
最后,如果 none 这些工作 return 404。