私のApache構成には、次の簡単な書き換えルールがあります。
これをnginxで書き換えるにはどうすればよいですか?
#
# Redirect all to index.php
#
RewriteEngine On
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (/[^.]*|\.)$ [NC]
RewriteRule .* index.php [L]
Nginxサーバーブロックは次のようになりますが、動作しません:(
root /home/user/www;
index index.php;
# Make site accessible from http://localhost/
server_name some-domain.dev;
###############################################################
# exclude /favicon.ico from logs
location = /favicon.ico {
log_not_found off;
access_log off;
}
##############################################################
# Disable logging for robots.txt
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
##############################################################
# Deny all attempts to access hidden files such as
# .htaccess, .htpasswd, .DS_Store (Mac).
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
##############################################################
#
location / {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php$args;
fastcgi_pass 127.0.0.1:9000;
}
###############################################################
# serve static files directly
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico)$ {
access_log off;
expires 30d;
}
###############################################################
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
# With php5-cgi alone:
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
}
1ファイルが存在しない限り、index.phpに書き換えられます
次をlocation ~ \.php$
に追加します
try_files = $uri @missing;
これは最初にファイルの提供を試み、見つからない場合は@missing
部分に移動します。また、次の設定をlocation
ブロックの外側に追加すると、インデックスページにリダイレクトされます
location @missing {
rewrite ^ $scheme://$Host/index.php permanent;
}
2ファイル拡張子が表示されないURL(.php)
pHP拡張機能を削除するには、以下をお読みください。 http://www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/
およびリンクからの構成例:
location / {
set $page_to_view "/index.php";
try_files $uri $uri/ @rewrites;
root /var/www/site;
index index.php index.html index.htm;
}
location ~ \.php$ {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/site$page_to_view;
}
# rewrites
location @rewrites {
if ($uri ~* ^/([a-z]+)$) {
set $page_to_view "/$1.php";
rewrite ^/([a-z]+)$ /$1.php last;
}
}
完璧な解決策私はそれを試してみましたが、サイト構成ファイルにこのコードを追加すると、インデックスページを取得できます。
location / {
try_files $uri $uri/ /index.php;
}
構成ファイル自体では、「最初に要求をファイルとして、次にディレクトリとして提供しようとし、次に私の場合はindex.htmlにフォールバックし、phpコードでページを提供しているのでindex.phpである」と説明しました。
Get変数も渡すには、$args
を使用します。
location / {
try_files $uri $uri/ /index.php?$args;
}
書き換えのないフラットでシンプルな構成は、場合によっては機能します。
location / {
fastcgi_pass unix:/var/run/php5-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php;
}
?の代わりにnginx $ is_argsを使用するGETクエリ文字列の場合
location / { try_files $uri $uri/ /index.php$is_args$args; }
2番目の質問の答えは次のとおりです。
location / {
rewrite ^/(.*)$ /$1.php last;
}
それは私のために働いています(私の経験に基づいて)、あなたのblabla.phpのすべてがblablaに書き換えられることを意味します
http://yourwebsite.com/index.php to http://yourwebsite.com/index
この質問のパート1を解決するのに役立ったのは次のとおりです。
location / {
rewrite ^([^.]*[^/])$ $1/ permanent;
try_files $uri $uri/ /index.php =404;
include fastcgi_params;
fastcgi_pass php5-fpm-sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors on;
}
rewrite ^([^。] * [^ /])$ $ 1/permanent;ファイル以外のアドレス(ファイル拡張子のないアドレス)を書き換えて、末尾に「/」を付けます。これは、「アクセスが拒否されました」に遭遇したためです。フォルダなしでフォルダにアクセスしようとしたときにメッセージが表示されます。
try_files $ uri $ uri//index.php = 404;はSanjuDの回答から借用していますが、場所がまだ見つからない場合は404の再ルーティングが追加されます。
fastcgi_index index.php;は、私が見逃していたパズルの最後のピースでした。この行がないと、フォルダーはindex.phpに転送されませんでした。
Codeigniterのようなフレームワークでこのようなルートがある場合に、index.phpのみ(fastcgiに他のphpファイルは渡されません)をfastcgiに渡したい場合
$route["/download.php"] = "controller/method";
location ~ index\.php$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi.conf;
}