Php 从虚拟主机上的Nginx Config中的请求检测URL查询参数

Php 从虚拟主机上的Nginx Config中的请求检测URL查询参数,php,nginx,redirect,parameters,url-rewriting,Php,Nginx,Redirect,Parameters,Url Rewriting,我在这台服务器上运行的虚拟主机(站点)很少 现在,在这个根虚拟主机上,我有一个论坛(在Docker上运行),但由Nginxmysite.com提供服务,我的AMP页面在 mysite.com/amp。这些AMP页面基本上是一个index.php文件&它们都由这个文件处理。PHP使用Nginx提供这些服务 我想要的是,当用户点击任何符合以下模式的请求时:(比如,这个域上的任何URL以?amp=1 mysite.com?amp=1 mysite.com/t/my-topic/121?amp=1

我在这台服务器上运行的虚拟主机(站点)很少

现在,在这个根虚拟主机上,我有一个论坛(在Docker上运行),但由Nginx
mysite.com
提供服务,我的AMP页面在
mysite.com/amp
。这些AMP页面基本上是一个
index.php
文件&它们都由这个文件处理。PHP使用Nginx提供这些服务

我想要的是,当用户点击任何符合以下模式的请求时:(比如,这个域上的任何URL
?amp=1

mysite.com?amp=1

mysite.com/t/my-topic/121?amp=1

mysite.com/c/CategoryCaseInsensitive/13?amp=1

mysite.com/u/john?amp=1

mysite.com/u/john/summary?amp=1
然后

我想重定向此请求并将其发送到我的AMP页面(该页面在PHP文件上运行,然后由
/var/www/AMP
中的
index.PHP
提供/处理)。现在PHP代码正在
/amp
上提供,但我想在
mysite.com?amp=1
上提供,所以
?amp=1
之前的任何URL

mysite.com?amp=1

mysite.com/t/my-topic/121?amp=1

mysite.com/c/CategoryCaseInsensitive/13?amp=1

mysite.com/u/john?amp=1

mysite.com/u/john/summary?amp=1
我曾尝试过此代码,但它似乎并不适用于所有情况:

#if ($arg_amp) {
#   return 302 /amp$request_uri;
#}
下面是此虚拟主机的当前NGINX配置文件:

    #Vhost Config Server, serving Ruby on Rails App on Docker on domain root
server {
    listen 443 ssl http2;
    ssl on;
    ssl_certificate         /var/www/cert/mysite.pem;
    ssl_certificate_key     /var/www/cert/mysite.key;


    server_name mysite.com www.mysite.com;
    location / {
        proxy_ssl_server_name       on;
        proxy_pass       http://localhost:PORT;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_redirect off;

        # Socket.IO Support
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_ssl_protocols         TLSv1 TLSv1.1 TLSv1.2;
       
       #if ($arg_amp) {
       #   return 302 /amp$request_uri;
       #}

    } 
    #Serving PHP code on /AMP route
    location @amp {
           rewrite ^/amp(.*) /amp/index.php?q=$1;
        }
    #will match any prefix for amp, amping, or amp/anything/any  

    location /amp {

    index index.php;
    try_files $uri $uri/ @amp;
    alias /var/www/amp;

#PHP config for Nginx
     location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        }

}
    #/amp route ends
}

这在Nginx中是不可能的吗?

我认为可以用更简单的方法来完成。如果您的
index.php
是唯一需要提供的php文件,那么您不需要整个
位置~\.php${…}
的东西

服务器{
...
地点/{
如果($arg_amp){
返回302/amp$request\u uri;
}
...
} 
位置/放大器{
#如果您确实需要一个原始URI作为查询参数
重写^/amp(.*)/amp/index.php?q=$1中断;
包括fastcgi_参数;
#硬代码脚本路径
fastcgi_param SCRIPT_FILENAME/var/www/amp/index.php;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
或者您可以完全跳过
重写
规则,只需从
$\u服务器['request\u URI']
获取原始请求URI,并从PHP代码中去掉
/amp
前缀:

位置/放大器{
包括fastcgi_参数;
fastcgi_param SCRIPT_FILENAME/var/www/amp/index.php;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
您甚至可以使用脚本处理这些请求,而无需302重定向:

服务器{
...
地点/{
如果($arg_amp){
重写^/amp$request\u uri last;
}
...
} 
位置/放大器{
内部的;
包括fastcgi_参数;
fastcgi_param SCRIPT_FILENAME/var/www/amp/index.php;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
可以从
$\u服务器['REQUEST\u URI']
访问原始URI