Apache-2.2

Apache 到 Nginx 的轉換(新手)

  • December 14, 2014

我有一個帶有 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;
   }
}

這是我的問題的解決方法,在對問題進行了大量研究之後,我發現它非常簡單:

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

這完美地工作。

請求處理

要記住的基本規則是:nginx 為一個位置提供請求(您可以更加強調:並且只有一個位置)。

閱讀: http: //nginx.org/en/docs/http/request_processing.html

location匹配

閱讀:location文件

根據您的配置,nginx 將首先匹配/blog 前綴位置,然後匹配\.php$ 正則表達式位置,並最終使用後者為請求提供服務。使用您提供的配置,腳本不應再作為原始文件下載,而應發送到 PHP。

但是,這並不意味著您的配置是正確的:您的/blog位置不提供請求,這在目前是無用的。

  1. 避免使用基於順序的正則表達式位置過濾請求是一種普遍的好習慣,這是不好的(還記得 Apache 指令的順序敏感性噩夢嗎?)。要進行過濾,請使用基於最長匹配的前綴位置。如果您最終需要一個正則表達式,您可以相互嵌入位置。
  2. 為什麼不直接將您的fastcgi*指令放入該/blog位置?然後,$fastcgi_script_namelocation可以/blog使用fastcgi_param SCRIPT_FILENAME $document_root/data/core/blog.php. 順便說一句,$fastcgi_script_filename已經包含了起始/,不需要在變數之間添加一個
  3. 如果可以避免使用重定向,請避免使用它們。尤其要避免rewrite更多。可以使用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;
   }
}

引用自:https://serverfault.com/questions/652343