Aka*_*run 5 php nginx nginx-location
我尝试使用Nginx设置类似"Apache Alias"的位置,但我无法在此文件夹中处理PHP脚本.
这是我的文件夹结构(适用于Dev环境):
/var/www
+- dev/public/ <-- This is my normal Web root : "/"
| +- assets/
| | +- app.css
| | +- app.js
| |
| +- index.php
| +- favicon.png
|
+- cut/public/ <-- This must like an "Apache Alias" : "/cut"
+- assets/
| +- app.css
| +- app.js
|
+- index.php
+- other_other_file.php (why not)
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的解决方案,但没有一个能正常工作.
这是我最好的Nginx配置:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
autoindex on;
# Logs
rewrite_log on;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
# Serving files
location / {
try_files $uri $uri/ @php;
}
location /cut {
root /var/www/cut/public;
try_files $uri $uri/ @php;
}
# PHP
location @php {
rewrite ^(.*)/?$ /index.php$is_args$args last;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Run Code Online (Sandbox Code Playgroud)
有了这个,我的cut/public/文件夹的所有内容被重定向到dev/public/index.php和解释(原因try_file,我推测).
这就是为什么欢迎你的帮助.
最终解决方案
在@ richard-smith回答之后,这是实施的解决方案:
server {
listen 80;
server_name _;
root /var/www/dev/public/;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ^~ /cut {
rewrite ^/cut/?(.*)$ /cut/public/$1 last;
}
location ^~ /cut/public {
root /var/www/;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Run Code Online (Sandbox Code Playgroud)
并行运行两个PHP应用程序,您需要一个公共文档根,或者您需要两个location ~* \.php(或类似)块以确保将正确SCRIPT_FILENAME的发送到fastcgi后端.
使用嵌套location块隔离/cut子目录,并使用^~顶层的修饰符来避免其他顶级正则表达式location块干扰(请参阅此文档).
该alias指令(请参阅此文档)用于映射/cut到/var/www/cut/public.该root指令只能连接,这将/var/www/cut/public/cut(你不想要).
但是,由于这个长期问题,我不建议将该alias指令与指令一起使用.try_files
所以,一个解决办法是悄悄改写/cut到/cut/public和使用的价值root /var/www.
例如:
location ^~ /cut {
rewrite ^/cut(.*)$ /cut/public$1 last;
}
location ^~ /cut/public {
root /var/www;
try_files $uri $uri/ /cut/index.php$is_args$args;
location ~* \.php(/|$) {
fastcgi_pass php:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19082 次 |
| 最近记录: |