Php 从虚拟主机上的Nginx Config中的请求检测URL查询参数
我在这台服务器上运行的虚拟主机(站点)很少 现在,在这个根虚拟主机上,我有一个论坛(在Docker上运行),但由NginxPhp 从虚拟主机上的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
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