在我们的Web项目中,我们有一个名为public
的目录。我们将nginx配置中的root
设置为此public
文件夹,以便只能通过URL访问public
文件夹中的文件。
我们的配置看起来有点像这样:
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
了。大。
但是,如何将我们的网址设置为example.com/v1
,其根目录为/srv/nginx/example.com/v1/public
?此外,如果我们上传新版本,则应该通过example.com/v2
的网址提供,其根目录为/srv/nginx/example.com/v2/public
而不更改配置文件。
我认为我可以实现这一目标的一种方法是每次上传新版本时都会生成多个服务器块。但就像我说的那样,每次我们上传新版本并且冒着做错事的风险时,我都不希望改变nginx配置。
还有其他方法吗?我该如何使用这些?
答案 0 :(得分:1)
使用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;
}
}
}
由于this issue,请避免将try_file
与alias
一起使用。有关使用if
的信息,请参阅this caution。