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