PHP 应用程序在 Nginx 上无法运行,但在 Apache 上可以运行

PHP 应用程序在 Nginx 上无法运行,但在 Apache 上可以运行

我想将 PHP 应用程序从 Apache 迁移到 Nginx。问题是应用程序崩溃了,因为路由不再起作用,而且我不太清楚如何修复它。

PHP 应用程序包含一些 .htaccess 文件,我尝试将它们转换为 Nginx。

第一个在文档根目录中:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteRule    ^$    public/    [L]
  RewriteRule    (.*) public/$1    [L]
</IfModule>

第二个在 /public/

<IfModule mod_rewrite.c
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  # Rewrite all other URLs to index.php/URL
  RewriteRule ^(.*)$ index.php?url=$1 [PT,L]
</IfModule>

<IfModule !mod_rewrite.c>
ErrorDocument 404 index.php
</IfModule>

第三个也是最后一个是:

deny from all

我的 nginx 版本如下所示:

#用户没人;
工作进程 1;


#pid 日志/nginx.pid;


事件 {
工作者连接1024;
}


http {
    包括 mime.types;
    默认类型应用程序/八位字节流;
    发送文件;
    #tcp_nopush 开启;
    保持活动超时 65;
    开启 gzip;

    服务器 {
      听 8080;
      服务器名称本地主机;
      根/图书馆/ Web服务器/文档/管理员;

      地点 / {
        索引索引.php;
        重写 ^/$ /public/break;
        重写 ^(.*)$ /public/$1 中断;
      }

      位置/公共{
        如果(!-e $ request_filename){
          重写^(.*)$ /index.php?url=$1 中断;
        }
      }

      位置 /图书馆 {
        全部否认;
      }
      #错误页面 404 /404.html;

      # 将服务器错误页面重定向到静态页面/50x.html
      #
      错误页面 500 502 503 504 /50x.html;
      位置 = /50x.html {
        根html;
      }

      位置 ~ \.php$ {
        根/图书馆/ Web服务器/文档/管理员;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index索引.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        包括 fastcgi_params;
       }
   }
}

我遇到的问题是路由出现问题,只返回 404 页面。希望有人有想法并知道如何修复它 ;)

谢谢

编辑

我使用这个配置让它工作

位置 /图书馆 {
     全部否认;
   }

   位置 ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
       访问登录关闭;
        重写 ^(.*)$ /public/$1 中断;
      }

      地点 / {
       重写 ^/(.+)$ /index.php?url=$1 最后;
      }

我相信有更好的解决方案,并且我愿意接受建议。

答案1

看起来好像您有一个路由循环。

您正在引导所有来自 的流量//public,然后引导所有来自 的流量/public/index.php

根据 /public/.htaccess,所有对 /public 的请求都应路由到,/public/index.php?url=$1而不是/index.php?url=$1

 location /public {
        if (!-e $request_filename){ 
          rewrite ^(.*)$ /public/index.php?url=$1 break;
        }
      }

相关内容