我使用 nginx 运行我的网站服务器。我目前使用 SSI(服务器端包含)来跨我网站上的 HTML 文件建立通用文件,目前运行良好。所以现在我想要一个照片库,其中的照片存储在目录 ( /var/www/photos
) 中,可以通过以下方式从我的网站访问它们:site.com/photo/PhotoTitle.jpg
将显示/var/www/photos/PhotoTitle.jpg
。
现在我正在使用以下代码来实现这一点:
location /photo {
root /var/www/photos;
}
这可以正常工作,并且如预期的那样,如果我转到site.com/photo/MilkyWay.jpeg
,它将指向 处的图像/var/www/photo/MilkyWay.jpeg
。但是我想在 HTML 模板中显示图像,因此我在我的网站上创建了一个文件 photo.html,它将使用 SSI 加载图像数据(title、src、ecc)。html 本身可以正常工作。但是,我无法像我希望的那样将“ site.com/photo/anything.jpeg
”指向/photo.html
。理想情况下,这应该可以解决问题:
location /photo {
ssi on;
set $photosrc $uri; #variable values are place holders right now
set $phototitle $uri;
set $photodesc "";
alias /photo.html;
}
但它只返回 404 错误。我也尝试过使用/photo/
和/photo/*
,虽然我不确定那会有什么变化,但无论如何结果没有改变。
我该怎么做?这超出了 NGINX 的范围吗?我想避免在单独的应用程序中使用代理传递,因为这对于一个页面来说太过分了,使用 html 应该没问题。但我也愿意接受这方面的建议。
答案1
这是我的完整配置。我后来做了一些修改,现在可以正常工作了:
map $request_uri $request_basename {
~/(?<captured_request_basename>[^/?]*)(?:\?|$) $captured_request_basename;
}
server {
listen 80;
listen 8080;
root /var/www/sito;
index index.html index.htm;
location / {
ssi on;
}
location * {
ssi on;
try_files /$uri /$uri.html /index.html =404;
}
location /posts {
proxy_pass http://127.0.0.1:2727;
proxy_redirect http://127.0.0.1:2727/ /;
proxy_read_timeout 60s;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
}
location /photos {
root /var/www;
}
location /photo {
ssi on;
ssi_last_modified on;
set $photosrc /photos/$request_basename;
set $phototitle $request_basename;
set $photodesc "";
try_files /photo.html =404;
}
}
现在的问题是我需要从 EXIF 数据中检索信息,例如拍摄日期或标题,但这超出了这个问题的范围,所以我将其标记为暂时已解决并继续前进。