在我们的网络项目中,我们有一个名为 public
的目录。我们设置root
在 nginx 配置中将此 public
文件夹,以便仅包含 public
中的文件文件夹可通过 URL 访问。
我们的配置看起来有点像这样:
server {
listen 80;
server_name example.com
root /srv/nginx/example.com/v1/public;
index index.html index.php;
location / {
try_files $uri $uri/ /index.php;
add_header Access-Control-Allow-Origin *;
}
location ~ \.php$ {
fastcgi_intercept_errors on;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass php-fpm;
}
}
现在我们可以访问 srv/nginx/example.com/v1/public
通过网址example.com
。太棒了。
但是我们如何将 URL 设置为 example.com/v1
根位于/srv/nginx/example.com/v1/public
?此外,如果我们上传新版本,则应该可以通过 example.com/v2
的 URL 获取该版本。根位于/srv/nginx/example.com/v2/public
无需更改配置文件。
我认为实现这一目标的一种方法是每次上传新版本时创建多个服务器 block 。但就像我说的,我不希望每次上传新版本时都更改 nginx 配置,并且有做错事情的风险。
还有什么其他方法吗?我该如何使用这些?
最佳答案
使用 regular expression location
block将 URI 拆分为两个部分并使用 alias
directive构造目标文件的路径(由 $request_filename
variable 表示)。
例如:
server {
listen 80;
server_name example.com
root /var/empty;
index index.html index.php;
add_header Access-Control-Allow-Origin *;
location ~ ^/(?<prefix>[^/]+)/(?<suffix>.*)$ {
alias /srv/nginx/example.com/$prefix/public/$suffix;
if (!-e $request_filename) { rewrite ^ /$prefix/index.php last; }
location ~ \.php$ {
if (!-f $request_filename) { return 404; }
fastcgi_intercept_errors on;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
fastcgi_pass php-fpm;
}
}
}
避免将 try_file
与 alias
一起使用,因为 this issue 。请参阅this caution关于 if
的使用。
关于nginx - 将 nginx root 设置为公共(public)文件夹,同时保留 URL 中的父目录名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927663/