NGINX 两个目录一个 URL (Codeigniter, HTML)
NGINX Two Directories One URL (Codeigniter, HTML)
这是我的 default.conf 文件:
server {
listen 80;
listen [::]:80;
root /var/www/html/;
server_name example.com;
# Site 01
location /* {
alias /var/www/html/home/;
index index.htm index.php;
try_files $uri $uri/ /home/index.html;
}
# Site 2
location /shadows {
alias /var/www/html/shadows/;
index index.htm index.php;
try_files $uri $uri/ /shadows/index.php;
}
error_page 404 /error/404.php;
fastcgi_intercept_errors on;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
我在
中有一个 Codeigniter 应用程序
var/www/html/shadows
我在
也有一个HTML网站
var/www/html/home
问题:
我已经能够为 home 目录或 shadows 目录工作,但不能同时为两者工作。
如果我将 root 更改为 /var/www/html/home,则会弹出 HTML 站点。
目前只有 shadows codeigniter 站点使用此配置弹出。
请告诉我您对解决此问题的想法。非常感谢。
如果我对你的理解正确,这样的事情应该有效:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
root /var/www/html/home;
location /shadows {
root /var/www/html;
index index.php;
}
}
在这种情况下,http://example.com/shadows/index.php 将解析为路径 /var/www/html/shadows/index.php
。
您可以通过 map
块获取 root
指令值:
map $uri $approot {
~^/shadows/ /var/www/html;
default /var/www/html/home;
}
server {
listen 80;
listen [::]:80;
root $approot;
server_name example.com;
# Site 01
location / {
index index.htm index.php;
try_files $uri $uri/ /index.html;
}
# Site 2
location /shadows/ {
index index.htm index.php;
try_files $uri $uri/ /shadows/index.php$is_args$args;
}
error_page 404 /error/404.php;
fastcgi_intercept_errors on;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
我假设您的 HTML 站点应该在根前缀 /
下提供服务,而不是 /home/
,因此我将您的 try_files $uri $uri/ /home/index.html;
指令更改为 try_files $uri $uri/ /index.html;
。我还将所有 alias
指令替换为 root
指令。正如 alias
指令所说 documentation
When location matches the last part of the directive’s value:
location /images/ {
alias /data/w3/images/;
}
it is better to use the root
directive instead:
location /images/ {
root /data/w3;
}
此外,当您同时使用 alias
和 try_files
指令时,还有一个众所周知的 bug,因此使用 root
指令更可靠。
这是我的 default.conf 文件:
server {
listen 80;
listen [::]:80;
root /var/www/html/;
server_name example.com;
# Site 01
location /* {
alias /var/www/html/home/;
index index.htm index.php;
try_files $uri $uri/ /home/index.html;
}
# Site 2
location /shadows {
alias /var/www/html/shadows/;
index index.htm index.php;
try_files $uri $uri/ /shadows/index.php;
}
error_page 404 /error/404.php;
fastcgi_intercept_errors on;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
我在
中有一个 Codeigniter 应用程序var/www/html/shadows
我在
也有一个HTML网站var/www/html/home
问题:
我已经能够为 home 目录或 shadows 目录工作,但不能同时为两者工作。
如果我将 root 更改为 /var/www/html/home,则会弹出 HTML 站点。
目前只有 shadows codeigniter 站点使用此配置弹出。
请告诉我您对解决此问题的想法。非常感谢。
如果我对你的理解正确,这样的事情应该有效:
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name example.com;
root /var/www/html/home;
location /shadows {
root /var/www/html;
index index.php;
}
}
在这种情况下,http://example.com/shadows/index.php 将解析为路径 /var/www/html/shadows/index.php
。
您可以通过 map
块获取 root
指令值:
map $uri $approot {
~^/shadows/ /var/www/html;
default /var/www/html/home;
}
server {
listen 80;
listen [::]:80;
root $approot;
server_name example.com;
# Site 01
location / {
index index.htm index.php;
try_files $uri $uri/ /index.html;
}
# Site 2
location /shadows/ {
index index.htm index.php;
try_files $uri $uri/ /shadows/index.php$is_args$args;
}
error_page 404 /error/404.php;
fastcgi_intercept_errors on;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
}
我假设您的 HTML 站点应该在根前缀 /
下提供服务,而不是 /home/
,因此我将您的 try_files $uri $uri/ /home/index.html;
指令更改为 try_files $uri $uri/ /index.html;
。我还将所有 alias
指令替换为 root
指令。正如 alias
指令所说 documentation
When location matches the last part of the directive’s value:
location /images/ { alias /data/w3/images/; }
it is better to use the
root
directive instead:location /images/ { root /data/w3; }
此外,当您同时使用 alias
和 try_files
指令时,还有一个众所周知的 bug,因此使用 root
指令更可靠。