![使用嵌套位置的别名指令来捕获 php 文件 - php 文件请求给出 404](https://linux22.com/image/627915/%E4%BD%BF%E7%94%A8%E5%B5%8C%E5%A5%97%E4%BD%8D%E7%BD%AE%E7%9A%84%E5%88%AB%E5%90%8D%E6%8C%87%E4%BB%A4%E6%9D%A5%E6%8D%95%E8%8E%B7%20php%20%E6%96%87%E4%BB%B6%20-%20php%20%E6%96%87%E4%BB%B6%E8%AF%B7%E6%B1%82%E7%BB%99%E5%87%BA%20404.png)
我有一个目录/网络应用程序,位于我的网站的网络根目录之外。
假设网站在这里:
/var/www/site/htdocs/
外部应用程序位于此处:
/var/www/apps/coolapp/
我的问题是如何配置 nginx 以将所有类似www.mysite.com/coolapp/*
(星号为通配符)的请求映射/路由到外部位置/var/www/apps/coolapp/
?例如,www.mysite.com/coolapp/test.php 应该是服务器/var/www/apps/coolapp/test.php
。
我添加了一个alias
指令,production.conf
主nginx.conf
文件包含该指令。这对除 .php 文件之外的所有文件都有效,因为还有另一个location
指令正在捕获 .php 文件。因此,我将一个嵌套location
在 中以alias
捕获 .php 文件,但现在 nginx 告诉我它找不到 .php 文件“404 文件未找到”。production.conf
目前的情况如下
server {
listen 80;
listen 443 ssl;
ssl_certificate /blah/blah/blah;
ssl_certificate_key /blah/blah/blah;
ssl_protocols blah blah blah;
ssl_ciphers blahblahblah;
ssl_prefer_server_ciphers blahblah;
access_log /var/log/nginx/www.mysite.com-access.log;
error_log /var/log/nginx/www.mysite.com-error.log error;
server_name mysite.com www.mysite.com;
root /var/www/site/htdocs;
include conf/magento_rewrites.conf;
include conf/magento_security.conf;
include /var/www/site/nginx/*.conf;
#-------CODE IN QUESTION-------
location /coolapp/ {
alias /var/www/apps/coolapp/;
location ~ \.php {
# Copied from "# PHP Handler" below
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_param HTTPS $fastcgi_https;
rewrite_log on;
# By default, only handle fcgi without caching
include conf/magento_fcgi.conf;
}
}
# PHP handler
location ~ \.php {
## Catch 404s that try_files miss
if (!-e $request_filename) { rewrite / /index.php last; }
## Store code is defined in administration > Configuration > Manage Stores
fastcgi_param MAGE_RUN_CODE default;
fastcgi_param MAGE_RUN_TYPE store;
fastcgi_param HTTPS $fastcgi_https;
rewrite_log on;
# By default, only handle fcgi without caching
include conf/magento_fcgi.conf;
}
# 404s are handled by front controller
location @magefc {
rewrite ^(.*) /index.php?$query_string last;
}
# Last path match hands to magento or sets global cache-control
location / {
## Maintenance page overrides front controller
index index.html index.php;
try_files $uri $uri/ @magefc;
expires 24h;
}
}
conf/magento_fcgi.conf 如下所示:
fastcgi_pass phpfpm;
## Tell the upstream who is making the request
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
# Ensure the admin panels have enough time to complete large requests ie: report generation, product import/export
proxy_read_timeout 1600s;
# Ensure PHP knows when we use HTTPS
fastcgi_param HTTPS $fastcgi_https;
## Fcgi Settings
include fastcgi_params;
fastcgi_connect_timeout 120;
fastcgi_send_timeout 320s;
fastcgi_read_timeout 1600s;
fastcgi_buffer_size 128k;
fastcgi_buffers 512 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors off;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
# nginx will buffer objects to disk that are too large for the buffers above
fastcgi_temp_path /tmpfs/nginx/tmp 1 2;
#fastcgi_keep_conn on; # NGINX 1.1.14
expires off; ## Do not cache dynamic content
有人看到我做错什么了吗?
答案1
啊,我明白了。我需要改一下这一行
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
到
fastcgi_param SCRIPT_FILENAME /var/www/apps$fastcgi_script_name;