请求处理

请求处理

我有一个使用 PHP 设置的 Nginx Web 服务器,我想继续使用 Nginx,并且我想将这些 .htaccess 规则转换为 nginx.conf 文件:

RewriteRule ^blog(|/)$ /data/core/site/blog.php
RewriteRule ^blog/post(|/)$ /data/core/site/blogpost.php

到目前为止,我所拥有的如下:

location /blog {
        rewrite ^(.*)$ /data/core/blog.php last;
    }

但是如果我访问该页面(http://example.com/blog), 它给我要下载的文件,我希望它为 PHP 提供服务并显示内容,我该如何解决这个问题?

完整的 Nginx 配置:(在 Windows 上使用 Winginx 包):

server {
    listen 127.0.0.1:80;
    server_name localhost;

    root home/localhost/public_html;

    index index.php;

    log_not_found off;
    #access_log logs/localhost-access.log;

    charset utf-8;

    location ~ /\. { deny all; }
    location = /favicon.ico { }
    location = /robots.txt { }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
        include fastcgi_params;
    }

    location /blog {
        rewrite ^(.*)$ /data/core/blog.php last;
    }
}

答案1

请求处理

要记住的基本规则是:nginx 处理一个位置的请求(你甚至可以更加强调:并且仅限一个位置)。

读:http://nginx.org/en/docs/http/request_processing.html

location匹配

读:location文档

根据您的配置,nginx 将首先匹配/blog 字首位置,然后在\.php$ 正则表达式位置,并最终使用后者来处理请求。使用您提供的配置,脚本不应再作为原始文件下载,而应发送到 PHP。

但是,这并不意味着您的配置是正确的:该请求不是由您的/blog位置提供的,这目前毫无用处。

  1. 避免使用基于顺序的正则表达式位置过滤请求是一种普遍的良好做法,这很糟糕(还记得 Apache 指令顺序敏感性噩梦吗?)。要进行过滤,请使用基于最长匹配的前缀位置。如果您最终需要正则表达式,则可以将位置嵌入彼此中。
  2. 为什么不直接将fastcgi*指令放入/blog位置?然后,您可以使用 而不是使用$fastcgi_script_name变量(从location匹配中猜测,这将是 的变体/blogfastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php。顺便说一句,$fastcgi_script_filename已经包含了起始/,无需在变量之间添加一个
  3. 尽量避免使用重定向。尤其要避免rewrite。简单的用户重定向(通过向客户端发送带有 HTTP 状态代码的重定向通知来完成 URL 重写)可以通过 来完成return。您在这里所做的是内部重定向(在服务器本地完成):它的唯一用途是更改随后用于参数的 URI SCRIPT_FILENAME

你可以使用以下方法开始:

location /blog {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php;
    include fastcgi_params;

    # Useless here since SCRIPT_FILENAME will never be a directory indeed
    fastcgi_index index.php;

    location /blog/post {
        fastcgi_pass 127.0.0.1:9054;
        fastcgi_param SCRIPT_FILENAME $document_root/data/core/blogpost.php;
        include fastcgi_params;
    }
}

答案2

这是对我的问题的修复,在对问题进行了大量研究之后,我发现它非常简单:

server {
listen 127.0.0.1:80;
server_name virjox www.virjox;

root home/virjox/public_html;

index index.php;

log_not_found off;
#access_log logs/virjox-access.log;

charset utf-8;

sendfile on;

location ~ /\. { deny all; }
location = /favicon.ico { }
location = /robots.txt { }  
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9054;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    include fastcgi_params;
    rewrite ^/(.*)\.html /$1\.php;
}
   location /blog {
     rewrite ^/blog(|/)$ /data/core/blog.php;
   }
}

而且效果很好。

相关内容