AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 15031
Accepted
allaryin
allaryin
Asked: 2009-05-30 11:30:54 +0800 CST2009-05-30 11:30:54 +0800 CST 2009-05-30 11:30:54 +0800 CST

Nginx 可以在别名中处理 php(或类似的 fcgi)请求吗?

  • 772

我正在将旧的 Apache 服务器转换为 Nginx,并且没有更改 URL 或重新排列文件系统的奢侈。

是否可以在 Nginx 配置中使用嵌套的 location{} 块来告诉它在正常提供静态内容的同时将别名目录中的 .php 文件提供给 fastcgi?

与我失败的类似配置:

server {
  listen 80;

  location / {
    index  index.html;
  }

  location /foosite/ {
    alias  /var/aliases/foo;
    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
  }
}

/foosite/static.jpg 的请求可以正常处理,但是 nginx 在尝试将它们分派到 fastcgi 时似乎会混淆任何 .php 文件的路径。

php fastcgi nginx
  • 3 3 个回答
  • 9969 Views

3 个回答

  • Voted
  1. Best Answer
    dcurtis
    2012-03-19T19:55:50+08:002012-03-19T19:55:50+08:00

    此处提供的解决方案不是解决方案。而且它不再正确了。使用 Lucid (10.4) 我能够使用这个解决方案。womble的解决方案的问题是它没有DOCUMENT_ROOT正确设置参数;相反,它在 document_root 中包含脚本名称。

    这似乎工作正常。

    location /foosite {
        alias /home/foosite/www/;
        index index.php index.html index.htm;
    
        location ~ /foosite/(.*\.php)$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$1;
            include /etc/nginx/fastcgi_params;            
        }                                                 
    }
    

    使用nginx/0.7.65

    • 6
  2. womble
    2010-01-02T19:40:40+08:002010-01-02T19:40:40+08:00

    据我所知,您所说的“乱码”是 nginx 中与嵌套位置块相关的错误(或者可能是位置块中的别名,它们在没有捕获的情况下进行基于正则表达式的匹配......我不确定) . 然而,我能够做的事情相当简单。
    首先,你可以把你所有的 fastcgi 参数,包括fastcgi_pass行和fastcgi_param SCRIPT_FILENAME $request_filename放入一个单独的文件中,以便包含在站点的相关部分中。我把我的放进去/etc/nginx/fragments/php。

    然后,对于/foosite,您需要两个位置块,如下所示:

    location /foosite {
        alias /var/aliases/foo;
    }
    
    location /foosite(.*\.php)$ {
        alias /var/aliases/foo$1;
        include /etc/nginx/fragments/php;
    }
    

    这里要提防的一件事-与“常规”位置块不同,基于正则表达式的匹配似乎按照配置文件中指定的顺序运行(不是最长匹配优先,就像非正则表达式的情况一样位置块)。因此,如果您正在处理特定于站点的 PHP 位置,以及通用的“全站点”PHP 处理程序 ( location ~ \.php$),那么您需要将通用的“全站点”处理程序放在服务器块的最后,或者所有的地狱都会崩溃。

    是的,这很糟糕,如果我有动力,我可能会尝试找出嵌套案例到底出了什么问题(配置解析器不会对它吐槽,所以我怀疑它应该可以工作,但实际上没有人使用它,所以它是越野车)。

    • 1
  3. Jauder Ho
    2009-05-30T16:18:05+08:002009-05-30T16:18:05+08:00

    AFAIK,您不能使用嵌套块。

    请尝试以下类似的方法。

    location / {
      root /var/www;
      access_log off;
    
      index index.php index.html;
      expires 1d;
    
      try_files $uri $uri/ /index.php?q=$uri;
    }
    
    location ~ \.php$ {
      fastcgi_pass   127.0.0.1:9000;
      fastcgi_index  index.php;
      fastcgi_buffer_size 128k;
      fastcgi_buffers 4 256k;
      fastcgi_param  SCRIPT_FILENAME  /var/www$fastcgi_script_name;
      include        /usr/local/nginx/conf/fastcgi_params;
    }
    

    您可以将第二个块修改为类似

    location ~ /foosite/.*php$
    

    (需要测试)

    • 0

相关问题

  • 使用Passenger时使用Nginx over Apache with Rails的优缺点是什么

  • 如何在 IIS 6 中免费重写 url (ala mod_rewrite)?

  • 阿帕奇的替代品

  • mod_rewrite 不转发 GET 参数

  • 更改 PHP 的默认配置设置?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve