Nginx:从根目录的子目录提供应用程序

Nginx:从根目录的子目录提供应用程序

我正在尝试将为 Apache 编写的应用程序(或其 .htaccess 文件)迁移到 Nginx,但遇到了一个我无法理解的问题。我来自 Apach 环境,所以这对我来说很新。

我有以下文件夹结构:

/var/www/mydomain.tld/

└── web
    ├── error
    ├── favicon.ico
    ├── my_application
    ├── index.html
    └── robots.txt

web是 mydomain.tld 的 www-root-folder,我的应用程序在 中/web/my_aplication/当调用 www.my_domain.tld 时,我想在 /my_application 中提供应用程序。

标准指令由 ISPConfig 自动创建,但我想我需要添加几行,但我不确定我做错了什么。以下是相关部分(我猜):

server {
  listen 1.2.3.4:80;
  server_name my_domain.tld;
  root   /var/www/mydomain.tld/web;

  ## force www - added this myself
  if ($http_host !~ "^www\.") { 
    rewrite ^(.*)$ http://www.$http_host$request_uri redirect; } 

  ## rewrite to /my_application/ and last
  if ($http_host ~* "^www.my_domain.tld$") { 
    rewrite ^/(.+)$ /my_application/$1 last; }

  index index.php index.html index.htm index.cgi index.pl index.xhtml;

  error_page 400 /error/400.html;
  # ....
  recursive_error_pages on;
  location = /error/400.html {
    internal;
  }
  ## ....

 **** this part here is explained below ****

}

除了 force-www-part 之外,这些指令都是自动生成的,实际上应该可以正常工作。

但现在需要翻译 my_application 文件夹中的 .htaccess-rules。我使用了htaccess 到 nginx 转换器并将一些 Nginx 指令包装在其中location / { ... }。我将位置更改为 /my_application,并将指令放在上面提到的位置:

locaction /my_application {
  rewrite (.*/)?info/([A-Za-z0-9_-]+)\.html.* /shop_content.php?gm_boosted_content=$2&$query_string break; 
  rewrite (.*/)?([A-Za-z0-9_-]+)\.html /product_info.php?gm_boosted_product=$2&$query_string break; 
  rewrite (.*/)?([A-Za-z0-9_-]+)/?.* /index.php?gm_boosted_category=$2&$query_string break;
}

## These are automatically generated directives for the root-folder (web, I guess).
## Please note that I have placed my own directives above them, I don't know
## if that mattes though.
location ~ \.php$ {
  try_files $uri =404;
  include /etc/nginx/fastcgi_params;
  fastcgi_pass 127.0.0.1:9010;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_param PATH_INFO $fastcgi_script_name;
  fastcgi_intercept_errors on;
}

所以,实际上没有什么太花哨的,但我就是无法让它工作......会发生什么:index.php 正在下载(未执行)。但我不太清楚为什么,因为这种方法与我通过 Google 找到的方法非常相似。但我可能遗漏了一些东西。

答案1

您在重写时使用了 break 标志,而不是 last。Break 意味着 Nginx 应该重写内部 URI,但不重新评估位置指令,因此它永远不会传递给 PHP,而是发送以供下载。

另外,它被下载但未显示的原因是您没有为 php 文件添加 mime 类型,并且您的 default_type 配置为 application/octet-stream。

相关内容