nginx tp5.* 配置,解决首页访问正常,其他请求(404,500)问题

本文记录了ThinkPHP5.1项目从本地测试环境成功迁移到Linux服务器的过程,包括遇到的问题及解决方案,如nginx配置、PHP环境调整等关键步骤。

 tp5项目在本地测试通过,但是上传到linux服务器上面的时候出现各种问题,折腾了两天终于解决,做个记录。

环境:乌班图 / nginx / php7.0 / thinkphp5.1

nginx安装方式未知(别人的服务器),安装后配置信息在/etc/nginx/sites-enable/default文件中,当然这个配置文件有很多种情况,有的是vhost,也有的是直接在nginx.conf(因机而已吧)。

下面是配置文件主要信息;

root 地址指向项目目录/public,看到有些网友说尽量不要指向public文件夹,但是也没说明具体原因,当然这也是我的知识盲区(毕竟nginx新手)。

下面是我的配置信息,仅仅做个参考吧。

注意:1.需要在php.ini中开启fix_pathinfo=1;去掉前面的分号注释。

           2.debug方式:查看nginx日志(error.log),虽然有些问题提示依旧找不到原因,但至少提供一个方向。

注释比较少,后面补充解释各个语句

 root /var/www/html/**/public; // ** 项目目录名称
 location / {

        try_files  $uri $uri/ /index.php?$query_string;
            
        if (!-e $request_filename) { 
           rewrite  ^(.*)$  /index.php?s=/$1 last; // 定义重写规则,参考tp5完全开发手册
           break;
        }

  }

 location ~ \.php(.*)$ {

        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO  $fastcgi_path_info;
        fastcgi_param  PHP_ADMIN_VALUE   "open_basedir=/var/www/html/**/:/tmp/:/proc/";         //**指项目目录,注意替换
        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
        include        fastcgi_params;

    }

附赠:用到的linux命令有

find / -name *** :查找/目录下的***文件

mv *** *** 移动文件/重命名

/usr/sbin/nginx -s reload 或者service nginx restart 重启nginx

php -m 查看PHP安装的拓展项目

vim中,i进入insert编辑模式,:wq编辑并保存,:q!保存退出,/查找


       

<think>我们正在处理一个关于Nginx配置问题,具体是关于location块中的路径映射(alias)没有按预期工作。用户希望修复配置中的路径映射问题。 根据用户提供的引用,我们有一些Nginx配置示例,但我们需要关注如何正确配置路径映射。 在Nginx中,`alias`指令用于在location块中定义路径替换。它通常用于将请求映射到文件系统中的特定目录,而不是location指定的路径。 常见的错误包括: 1. 缺少结尾的斜杠:在location路径和alias路径中,结尾的斜杠必须一致(要么都有,要么都没有)。 2. 权限问题Nginx进程需要对alias指向的目录有读取权限。 3. 配置语法错误,如缺少分号等。 另外,我们也可以使用`root`指令,但要注意`root`和`alias`的区别: - `root`:指定的路径会与location的路径拼接。 - `alias`:指定的路径会替换location的路径。 例如: location /i/ { alias /data/w3/images/; } 请求“/i/top.gif”将返回文件“/data/w3/images/top.gif”。 而使用root: location /i/ { root /data/w3; } 请求“/i/top.gif”将返回文件“/data/w3/i/top.gif”。 用户的问题中提到了“alias not working as expected”,因此我们需要检查alias的配置。 根据用户提供的引用[1]中的配置片段: server { listen 80; server_name localhost; location / { client_max_body_size 100m; root /usr/share/nginx/html/totodoc; index index.html index.htm; } ... } 这里使用的是`root`指令,而不是`alias`。所以用户可能是在尝试使用`alias`时遇到了问题,但配置中并没有出现alias。 由于用户没有提供具体的alias配置,我们将假设一个常见的alias配置问题场景,并给出解决方案。 常见问题1:location路径和alias路径的斜杠不匹配。 错误配置示例: location /static { alias /var/www/app/static/; } 当请求/static/style.css时,Nginx会尝试访问/var/www/app/static//style.css(注意双斜杠,这通常没问题)但更严重的是,如果location没有结尾斜杠,而alias有,那么可能会造成路径混乱。 正确的做法是保持斜杠一致: location /static/ { alias /var/www/app/static/; } 或者(如果location没有结尾斜杠,alias也不应该有): location /static { alias /var/www/app/static; } 但是,第二种情况在请求/static时,Nginx访问/var/www/app/static(一个目录),而请求/static/时,Nginx访问/var/www/app/static/(也是目录),但请求/staticfile时也会匹配(可能不是期望的)。所以通常建议使用第一种(带斜杠)来避免歧义。 另外,还需要注意: - 检查目录是否存在和权限。 - 检查Nginx的错误日志(通常位于/var/log/nginx/error.log)以获取更多信息。 如果用户使用的是root,那么也要注意root指令的路径拼接规则。 根据用户引用[2]中的挂载配置,用户可能将主机目录挂载到容器内,因此需要确保容器内的路径与配置中的路径一致。 例如,在引用[2]中: -v /mnt/docker-nginx/html:/usr/share/nginx/html 那么,在Nginx配置中,如果使用root指向/usr/share/nginx/html,那么实际对应主机的/mnt/docker-nginx/html目录。 如果用户配置了alias,同样需要确保alias的路径在容器内存在,并且对应挂载的主机目录。 现在,我们假设用户遇到了一个具体的alias配置问题,我们可以给出一个通用的解决步骤: 步骤1:检查Nginx配置语法 运行:nginx -t 这会检查配置文件语法,并报告错误。 步骤2:检查location和alias的路径是否一致(结尾斜杠) 步骤3:检查alias指向的目录是否存在,并且Nginx工作进程(通常是www-data或nginx用户)有权限读取。 步骤4:查看错误日志。 步骤5:如果使用Docker,确保挂载的卷路径正确,并且容器内的目录存在。 由于用户的问题是关于路径映射,我们还可以给出一个示例配置,说明如何正确使用alias。 示例:假设用户希望将请求的URL路径“/app”映射到文件系统的“/var/www/app/public”目录。 正确配置: location /app/ { alias /var/www/app/public/; # 注意:如果请求以/app/开头,则映射到/var/www/app/public/目录下 # 例如:/app/index.html -> /var/www/app/public/index.html } 注意:如果请求的URL是/app(没有结尾斜杠),Nginx会返回301重定向到/app/(如果配置了autoindex on或者存在index文件)。但为了确保正确,通常建议客户端请求以斜杠结尾。 如果用户希望同时匹配/app和/app/,可以这样: location /app { alias /var/www/app/public; # 这样,请求/app或/app/都会匹配,但是要注意: # 请求/app时,会映射到/var/www/app/public(如果public是一个文件,则返回该文件,如果是目录,则取决于index设置或autoindex) # 但通常,如果public是目录,我们更希望请求以斜杠结尾,所以可以在内部重定向: if ($request_uri ~ ^/app[^/]*$ ) { rewrite ^(.*)$ $1/ permanent; } } 不过,更简单的方式是要求客户端请求以斜杠结尾,或者使用两个location块。 由于问题描述不够具体,我们只能给出一般性建议。 最后,我们生成相关问题。</think>### Nginx路径映射问题分析与解决Nginx配置中,`alias`指令用于路径替换映射,而`root`指令用于路径拼接映射。配置不当会导致文件无法访问,常见问题如下: #### 核心配置原则 1. **`alias`与`root`区别** - `root`:将location路径拼接到指令值后 例如:`location /img/ { root /data; }` 请求`/img/logo.png` → 文件`/data/img/logo.png` - `alias`:用指令值直接替换location路径 例如:`location /img/ { alias /data/; }` 请求`/img/logo.png` → 文件`/data/logo.png` 2. **斜杠一致性规则** location路径结尾的`/`必须与alias路径结尾的`/`严格匹配,否则会导致路径解析错误[^1]。 #### 错误配置示例与修复 **问题配置**(引用自用户配置片段): ```nginx location /static { alias /var/www/app/static; # 缺少结尾斜杠 } ``` 请求`/static/style.css` → 尝试访问`/var/www/app/staticstyle.css`(文件不存在) **正确配置**: ```nginx location /static/ { # 添加结尾斜杠 alias /var/www/app/static/; # 添加结尾斜杠 } ``` 此时请求`/static/style.css` → 正确映射到`/var/www/app/static/style.css` #### 完整调试步骤 1. **检查路径权限** ```bash namei -l /var/www/app/static/ # 确认Nginx用户(www-data)有读取权限 ``` ![](https://example.com/perm_check.png) *权限检查示意图* 2. **验证配置语法** ```bash nginx -t -c /etc/nginx/nginx.conf # 测试配置文件语法[^2] ``` 3. **查看错误日志** ```bash tail -f /var/log/nginx/error.log # 实时监控错误日志 ``` 常见错误:`open() "/path" failed (2: No such file or directory)` 4. **Docker特有注意事项** 若使用Docker,需确保卷挂载路径一致(引用自用户配置[^2]): ```bash -v /host/path/static:/var/www/app/static # 主机路径:容器路径 ``` #### 进阶配置建议 - **正则路径映射** ```nginx location ~ ^/user/(.+\.avatar)$ { alias /data/avatars/$1; # $1捕获文件名 } ``` - **备用路径设置** ```nginx location /legacy/ { alias /backup/old-site/; try_files $uri $uri/ =404; # 链式尝试访问 } ``` --- ### 常见问题解答 **Q1:为什么修改配置后仍不生效?** A:可能原因包括: - 未重载Nginx:`nginx -s reload` - 浏览器缓存:使用`curl -I http://localhost/static/test.txt`测试 - SELinux限制:`setenforce 0`临时关闭测试 **Q2:`alias`和`root`如何选择?** A: - 需要**完全替换**location路径 → 用`alias` - 需要**追加**location路径 → 用`root` **Q3:如何避免路径遍历攻击?** A:添加安全限制: ```nginx location /protected/ { alias /data/secret/; deny all; # 禁止直接访问 allow 192.168.1.0/24; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值