账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    在Nginx下如何实现某个虚拟主机同时匹配指定路径与UA时执行php其余情况按规则301重定向
    34
    0

    判断逻辑大概是:

    如果 UA=="TargetUA" 且 请求路径=="/TargetPHP.php" 则
        转发请求给PHP-FPM处理执行php
        写入请求成功日志到 /var/log/nginx/TargetPHP.access.log
        写入请求失败日志到 /var/log/nginx/TargetPHP.error.log
    否则
        重定向(重写) https://domain/请求路径 [永久]

    然后这是我现在尝试使用的配置:

    server {
            listen 80;
            listen [::]:80;
            root /path/to/root;
            index index.php;
            server_name domain1;
            location = /TargetPHP.php {
                    if ( $http_user_aget !~ "TargetUA" ){
                           break;    
                    }
                    include snippets/fastcgi-php.conf;
                    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
                    access_log /var/log/nginx/TargetPHP.access.log;
                    error_log /var/log/nginx/TargetPHP.error.log;
            }
            location / {
                    rewrite ^(.*)$  https://$host$1 permanent;
                    access_log /var/log/nginx/Rewrite.access.80.log;
                    error_log /var/log/nginx/Rewrite.error.80.log;
            }
    }
    

    现在已知的是底下匹配/的location然后重定向没问题,上边那个匹配单个文件的location貌似不能匹配上.另外文件什么的都是存在的,而且如果把rewrite去掉,全部目录启用php,也是可以访问到的.我只是出于安全和保密以及重定向到https的考虑,才想着只开放一个php,这个php是只允许本地使用curl调用的(crontab做的定时任务),所以加了个UA的限制,如果能过滤到IP(例如把localhost/127.0.0.1来的请求单独处理)也是可以接受的.
    求大佬们帮忙Debug.....

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 头头碰着黑 普通会员 1楼

      在Nginx中,我们可以使用Location块来实现一个虚拟主机的规则。在这个规则中,我们指定一个虚拟主机(virtual host)的URL,然后使用Location块来控制请求到这个虚拟主机的URL时的行为。

      首先,我们需要创建一个虚拟主机文件。例如,我们可以创建一个名为"example.com"的虚拟主机文件。在这个文件中,我们可以定义一个规则来匹配特定的路径和用户代理(User-Agent)。

      ```nginx server { listen 80; server_name example.com;

      location / {
          if ($request_uri ~ \.php$) {
              set $request_uri /index.php;
              rewrite ^(.*)$ /index.php?$1;
          }
      }
      

      } ```

      在这个规则中,我们首先监听80端口。然后,我们设置服务器名称为example.com。接着,我们定义一个匹配所有以.php结尾的路径的规则。在这个规则中,我们使用了一个正则表达式来匹配这些路径,然后将它们替换为与之匹配的URL。最后,我们使用了Rewrite规则来重定向所有的匹配到这个URL的请求。

      要使这个规则在用户代理发生变化时仍然生效,我们需要在location块中添加一个额外的判断。例如,我们可以使用user_agent参数来检查用户的代理。

      ```nginx server { listen 80; server_name example.com;

      location / {
          if ($request_uri ~ \.php$) {
              set $request_uri /index.php;
              rewrite ^(.*)$ /index.php?$1;
              user_agent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3";
          }
      }
      

      } ```

      在这个规则中,我们添加了一个user_agent参数,并将它设置为"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"。这将使我们的规则在用户代理发生变化时仍然生效。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部