使用 nginx 将所有请求重写到 index.php

在我的 apache 配置中,我有以下简单的重写规则

  1. 除非文件存在,否则将重写到 index.php
  2. 在 url 上你永远不会看到文件扩展名(. 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;
}
194220 次浏览

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

在我的例子中,它是 index.php,因为我提供了一页到一页的 PHP 代码。

无需重写的平面简单配置,在某些情况下可以工作:

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/forever; 重写非文件地址(没有文件扩展名的地址) ,使其末尾有一个“/”。我这么做是因为我遇到了“拒绝访问”当我试图不用它来访问文件夹的时候。

Try _ files $uri $uri//index.php = 404; 是借用了 SanjuD 的回答,但是如果仍然找不到位置,还需要额外的404路由。

Fastcgi _ index index.php; 是我遗漏的最后一块拼图。如果没有这一行,文件夹不会重新路由到 index.php。

要传递 get 变量,也可以使用 $args:

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

如果您只想将 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.php

http://yourwebsite.com/index.phphttp://yourwebsite.com/index

使用 nginx $is _ args 代替? 用于 GET 查询字符串

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