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


11

我有一个PHP脚本,可以处理脚本路由并完成各种花哨的事情。它最初是为Apache设计的,但我正尝试将其迁移到Nginx,以供我使用。现在,我正在尝试在测试服务器上进行平滑处理。

因此,脚本的工作方式是使用.htaccess文件拦截目录(在Apache中)的所有HTTP通信。看起来像这样:

<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;
                }
        }
}

Answers:


13

加上这个

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

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

确保try_file指令从版本0.7.27起可用。


警告:这不适.php 用于以结尾的url ,例如,它将起作用:/doesNotExist.ph ,但这将不起作用(取而代之的是404):/doesNotExist.php
hanshenrik

7

我自己解决了!是的

我需要的location是:

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

其他所有内容都基本相同。


您是否尝试过我在下面写的内容?这也确实意味着您的所有静态文件都将通过index.php-不确定您是否想要这样做。
亚当·贝纳永

@Adam:是的,我尝试了您的代码。我希望一切都通过index.php运行。不过谢谢!
mattbasta

2

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

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

$ is_args变成'?' 如果$ args不为空

甚至更简单:

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

警告:这不适.php 用于以结尾的url ,例如,它将起作用:/doesNotExist.ph ,但这将不起作用(取而代之的是404):/doesNotExist.php
hanshenrik


0

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.