使用 Nginx 作为使用 Apache 和 URL 重写的 PHP 站点的反向代理

使用 Nginx 作为使用 Apache 和 URL 重写的 PHP 站点的反向代理

我正在尝试使用 Nginx 作为运行 PHP 站点的 Apache 的缓存反向代理。它有点工作正常,但问题出现在尝试将 URL 重写到 Apache 设置时,它没有像我希望的那样工作。这是设置。

我有一个基于 Joomla 的 PHP 网站,运行在 Apache 上,端口 8080 (http) 和 44343 (https) - 运行正常,这里没有问题。我删除了 Joomla 文件,.htaccess因为我认为 Nginx 会自行重写index.php并负责缓存必要的 PHP 文件。

Joomla 像这样重写 URL example.com/page1=>example.com/index.php/page1

我有 Nginx 监听端口 80、443。以下是站点配置

server {
   listen 80;
   listen [::]:80;

   server_name    www.example.com
   return         301 https://$server_name$request_uri;
}
server {
    client_max_body_size 100M;
    autoindex off;

    listen 443 ssl;
    listen [::]:443 ssl;

    server_name www.example.com;
    server_name_in_redirect off;

    ssl_certificate /example.com/ssl.crt;
    ssl_certificate_key /example.com/ssl.key;

    root /var/www/site;

    index index.php index.html index.htm default.html default.htm;

    location / {
       try_files $uri $uri/ /index.php$uri;
    }

    # Reverse Proxy and Proxy Cache Configuration
    location ~ \.php {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass https://127.0.0.1:44343;

        # Cache configuration
        proxy_cache reverse_cache;
        proxy_cache_valid 3s;
        proxy_no_cache $cookie_PHPSESSID;
        proxy_cache_bypass $cookie_PHPSESSID;
        proxy_cache_key "$scheme$host$request_uri";
        add_header X-Cache $upstream_cache_status;
    }

    ...
}

因此,这会加载网站,但无论我转到哪个页面,它总是加载主页。它似乎没有像预期的那样将$uri部分发送到。index.phptry_files

我能使它工作的唯一方法是按照以下方式修改它:

    #location / {
    #   try_files $uri $uri/ /index.php$uri;
    #}

    # Reverse Proxy and Proxy Cache Configuration
    location / {
        ...
    }

这只是将整个请求发送给 Apache,我必须带回.htaccess允许 Apache 进行重写的文件。

网站按预期加载,但问题是没有缓存 PHP 文件(在 /var/cache 中检查)。因此 Nginx 必须进行重写才能知道哪个 PHP 文件针对哪个请求进行缓存。

知道怎样做吗?

答案1

这只是建议,但您的上游应用可能还需要查询字符串和原始 URI。您可以尝试将默认 URI 修改为:

try_files $uri $uri/ /index.php$request_uri;

或者:

try_files $uri $uri/ /index.php$uri$is_args$args;

变量nginx包括记录在这里

相关内容