用nginx重写所有对index.php的请求

在我的Apacheconfiguration,我有以下简单的重写规则

  1. 除非文件存在将重写到index.php
  2. 在你永远不会看到文件扩展名(.php)

我怎么能重写这个在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; 

这将首先尝试提供该文件,如果没有find它将移动到@missing部分。 所以也添加以下内容到您的configuration( location块外),这将redirect到您的索引页面

 location @missing { rewrite ^ $scheme://$host/index.php permanent; } 

2在你永远不会看到文件扩展名(.php)

删除php扩展阅读以下内容: http : //www.nullis.net/weblog/2011/05/nginx-rewrite-remove-file-extension/

以及链接中的示例configuration:

 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 ~* ^/([az]+)$) { set $page_to_view "/$1.php"; rewrite ^/([az]+)$ /$1.php last; } } 

完美的解决scheme我已经尝试过,并成功获得我的索引页,当我在我的网站configuration文件中追加此代码。

 location / { try_files $uri $uri/ /index.php; } 

在configuration文件本身解释说,在“首先尝试作为文件服务请求,然后作为目录,然后回到index.html在我的情况下是index.php,因为我通过php代码提供页面。

要传递getvariables以及使用$args

 location / { try_files $uri $uri/ /index.php?$args; } 

平坦而简单的configuration无需重写,可以在某些情况下工作:

 location / { fastcgi_pass unix:/var/run/php5-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /home/webuser/site/index.php; } 

这是什么为我解决这个问题的第一部分:

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

重写^([^。] * [^ /])$ $ 1 / permanent; 重写非文件地址(没有文件扩展名的地址)在最后有一个“/”。 我这样做是因为我遇到了“访问被拒绝”。 当我尝试访问没有它的文件夹时出现消息。

try_files $ uri $ uri / /index.php=404; 是从三好市的答案借来的,但是如果还没有find位置的话,还要多加一个404重新路由。

fastcgi_index index.php; 是我失踪的最后一块难题。 该文件夹没有重新路由到index.php没有这一行。

如果你想通过index.php(没有其他的PHP文件将被传递给fastcgi)fastcgi万一你有这样的路线在像codeigniter这样的框架

 $route["/download.php"] = "controller/method"; location ~ index\.php$ { fastcgi_pass 127.0.0.1:9000; include fastcgi.conf; } 

这是你的第二个问题的答案:

  location / { rewrite ^/(.*)$ /$1.php last; } 

这是我的工作(根据我的经验),意味着你所有的blabla.php将重写成blabla

http://yourwebsite.com/index.php到http://yourwebsite.com/index

使用nginx $ is_args而不是? 对于GET查询string

 location / { try_files $uri $uri/ /index.php$is_args$args; }