小能豆

nginx代理php,如何为php设置访问地址为子路径

php

我有一个域名,假设为example.com,后端nginx已经代理了一个tomcat,代理域名是http://www.example.com/,会跳转到tomcat服务,目前这是正常的。

现在我想再增加一个php服务,在同一个服务器上,用同一个nginx代理,url路径为“http://www.example.com/php”,访问到/data/wwwroot/php下的php代码。

但是,访问http://www.example.com/php的时候会转发的tomcat服务上面,提示“HTTP状态 404 - 未找到”,后缀显示是Apache Tomcat服务。

所以我怀疑代理没有生效,当我将php代理的域名换成其他的时候,比如php.example.com,代理是成功的,但是我不想遇到跨域的问题。请问php应该怎么设置才行

这是nginx代理tomcat的配置
server {
listen 80;
server_name www.example.com;

location / {
    proxy_pass http://localhost:8080;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header REMOTE-HOST $remote_addr;
    add_header X-Cache $upstream_cache_status;
    proxy_set_header X-Host $host:$server_port;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 30s;
    proxy_read_timeout 86400s;
    proxy_send_timeout 30s;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

}

这是nginx代理php的配置,这里不正常
server {
listen 80;
server_name www.example.com;

location /php {
    try_files $uri $uri/ /index.php$is_args$args;
    alias  /data/wwwroot/php;
    index index.php index.htm index.html;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

}


阅读 44

收藏
2024-06-01

共1个答案

小能豆

根据你提供的配置,出现问题的可能原因是nginx的location匹配规则导致请求被误导到了错误的地方。在第二个server块中的location配置中,匹配的是以/php开头的URL路径,但这样配置会导致请求http://www.example.com/php被错误地匹配到了这个location块,而实际上你希望它被代理到php服务。

为了解决这个问题,你可以调整nginx的配置,使得URL路径为/php的请求被正确地代理到php服务。下面是一种可能的解决方案:

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        proxy_set_header X-Host $host:$server_port;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 30s;
        proxy_read_timeout 86400s;
        proxy_send_timeout 30s;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /php {
        try_files $uri $uri/ /php/index.php$is_args$args;
        root /data/wwwroot;  # 修改根目录为上层目录
        index index.php index.htm index.html;

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

在这个配置中,我修改了location /php的配置,将根目录调整为/data/wwwroot,然后在try_files指令中修改了索引文件的路径为/php/index.php。这样,当请求http://www.example.com/php时,nginx会正确地代理到/data/wwwroot/php/index.php文件。

2024-06-01