특정 경로의 별칭 내에서 index.php에 대한 nginx 경로를 만들려고 합니다. 하위 도메인을 사용하고 다른 이름의 서버 블록을 추가하는 것이 더 쉬울 수 있지만, 내 프로젝트에는 주제와 관련이 없는 몇 가지 이유로 이 구조가 필요합니다. 간단히 말해서 다음을 원합니다.
1. www.example.com --> /home/user/www/public/index.php
2. www.example.com/a/b --> /home/user/www/public/index.php
3. www.example.com/api --> /home/user/api/public/index.php
4. www.example.com/api/a/b --> /home/user/api/public/index.php
숫자 1과 2는 매우 표준적입니다. 항상 index.php 파일(특정 루트에 있음)을 제공하고 PHP가 라우팅을 처리하도록 합니다. 3번은 하위 도메인 구성을 시뮬레이션합니다(다른 디렉터리의 index.php를 가리켜야 함).
1-3번은 작동했지만 4번은 작동하지 않았습니다. www.example.com/api/a/b에 갈 때마다 404가 표시됩니다. 오류 로그에 nginx가 저에게 서비스를 제공하려고 한다고 알려줍니다. 홈/사용자/API/공개//a/b/. 해결책에 거의 근접한 것 같지만 제대로 이해하지 못하는 것 같습니다. 또한 동일한 방식으로 정적 파일을 제공할 수도 있습니다.
다음 구성이 관련됩니다.
server {
listen 80;
server_name example.com www.example.com;
root /home/user/www/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location /api {
alias /home/user/api/public/;
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
미리 감사드립니다.
해결책
server {
listen 80;
server_name example.com www.example.com;
root /home/user/www/public;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location /api/ {
alias /home/user/api/public/;
try_files $uri /api/index.php =404;
location ~ \.php$ {
try_files $uri /index.php =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
}
답변1
당신은 꽤 가깝습니다. 하지만 /
의 후행 문자 location
와 해당 문자를 일치시켜야 합니다 alias
.
try_files
또한 올바른 를 참조하려면 해당 블록에 를 추가해야 합니다 . index.php
아마도 입니다 /api/index.php
.
location /api/ {
alias /home/user/api/public/;
try_files $uri /api/index.php;