Nginx - 将所有请求路由到单个脚本

Nginx - 将所有请求路由到单个脚本

我有一个 PHP 脚本,它可以处理脚本路由并执行各种奇特的操作。它最初是为 Apache 设计的,但我正尝试将其迁移到 nginx 以用于我的一些机器。现在,我正尝试在测试服务器上使一切顺利进行。

因此,脚本的工作方式是使用文件拦截目录(在 Apache 中)的所有 HTTP 流量.htaccess。如下所示:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

非常简单。所有请求都通过 进行index.php,简单明了。

我想在 nginx 上模仿这种行为,但还没有找到方法。有人有什么建议吗?

nginx.conf这是我现在的文件副本。请注意,它只是为我设计的,只是为了尝试让它工作;主要是复制/粘贴工作。

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}

答案1

添加这个,

 location / {
                    try_files $uri $uri/ /index.php;
            }

它首先检查 $uri 和 $uri/ 是否存在于真实文件/文件夹,如果不存在,则只会通过 /index.php(这是我为 Zend 框架设置的,其中路由通过 index.php 完成) - 当然,如果您需要传递一些参数,只需在 /index.php 末尾附加 ?q=,它就会传递参数。

确保 try_file 指令从 0.7.27 及更高版本开始可用。

答案2

我自己想出来的!耶!

我所需要的location只是:

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

其余一切基本保持不变。

答案3

要保留 GET 参数,请使用以下命令:

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

如果 $args 不为空,则 $is_args 变为 '?'

或者更简单:

location / {
    try_files /index.php$is_args$args;
}

答案4

当您的目标是 PHP 文件时,需要注意的一个非常重要的陷阱是确保您使用的任何return/rewrite规则都不会取代location ~ \.php指令。如果发生这种情况,nginx 将提供您的 PHP 文件而不对其进行渲染,从而泄露 PHP 源代码。这可能是灾难性的。

最安全的方法已经提供,location / { try_files $uri $uri/ /index.php; }

确保您还在块index index.php中设置location /并取消注释location ~ \.php默认配置文件中包含的块。

相关内容