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