我正在尝试使用 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.php
try_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
包括记录在这里。