Nginx SSI include 解析不了../ ?

咨询一下 SSI include 我用../ 解析不了 报错
unsafe URI "/ceshi/html/../js/js.html" was detected while sending response to client, client: 127.0.0.1, server: localhost, request: "GET /ceshi/html/index.html HTTP/1.1", host: "localhost"

这个问题怎么解决呀 , 我想用../可以寻找上一级的 但是我发现 他好像只能从根目录找 或者 当前目录

网上也没有找到相关的内容

window系统

阅读 698
avatarAI BotBETA
### 回答

这个问题是因为 Nginx 的 SSI (Server Side Includes) 模块默认对包含文件的路径有安全限制,以防止路径遍历攻击(Path Traversal Attacks)。当你尝试使用 `../` 来引用上一级目录的文件时,Nginx 会认为这是一个不安全的 URI,从而拒绝解析。

#### 解决方案

1. **修改 Nginx 配置以允许相对路径**:
   你可以通过修改 Nginx 的配置文件来放宽对 SSI 包含文件路径的限制。不过,这样做可能会带来安全风险,因此应谨慎操作。

   在 Nginx 配置文件中,找到处理 SSI 的部分(通常在 `location` 块内),并添加或修改 `ssi_types` 和 `ssi_set` 指令。例如:

location ~* .(html|shtml)$ {

   ssi on;
   ssi_types text/html;
   # 放宽路径限制(不推荐在生产环境中使用)
   ssi_min_types text/html text/shtml;
   ssi_set $document_root /your/document/root;  # 确保这是你的实际文档根目录
   # 你可以尝试添加或修改以下指令来允许更宽松的路径解析,但注意安全性
   # 注意:这里并没有直接的配置可以允许使用 '../',通常这是被禁止的
   # 你可能需要重新考虑你的文件结构和包含策略

}


**注意**:直接允许使用 `../` 在大多数服务器配置中是不被推荐的,因为这可能会暴露服务器上的敏感文件。

2. **调整文件结构**:
一个更安全且推荐的做法是调整你的文件结构,使得不需要使用 `../` 就可以包含所需的文件。例如,将公共的文件(如 JavaScript、CSS 等)放在一个公共的目录中,然后在各个页面中引用这个公共目录中的文件。

3. **使用绝对路径**:
在 SSI 的 `<!--#include virtual="..." -->` 中使用从网站根目录开始的绝对路径,而不是相对路径。

总之,最安全的做法是避免在 SSI 中使用 `../`,并通过调整文件结构或使用绝对路径来解决问题。如果确实需要更复杂的路径解析,可能需要考虑使用其他服务器端技术(如 PHP、Python 等)来处理文件包含。
1 个回答
新手上路,请多包涵

执行nginx -h

root:~ $ nginx -h
nginx version: nginx/1.18.0
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: /usr/share/nginx/)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file

其中-p prefix表示指定相对路径的prefix. 类似于指定工作目录.

比如: 执行nginx -p /home/test/public,

nginx.conf配置:

http {
    include /etc/nginx/mime.types;
    root .;
    server {
        listen 8000;
    }
}

nginx将以/home/test/public/作为根目录.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏