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

时间:2012-10-16 23:17:59

标签: url-rewriting nginx

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

  1. 除非文件存在,否则将重写为index.php
  2. 在您永远不会看到文件扩展名(.php)
  3. 的网址上

    如何在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;
    }
    

8 个答案:

答案 0 :(得分:100)

完美的解决方案我已经尝试过并在我的网站配置文件中附加此代码后成功获取索引页。

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

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

答案 1 :(得分:54)

要传递get变量,请使用$args

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

答案 2 :(得分:33)

1除非文件存在,否则将重写为index.php

将以下内容添加到location ~ \.php$

try_files = $uri @missing;

这将首先尝试提供该文件,如果找不到,它将移至@missing部分。所以还要在配置中添加以下内容(在location块之外),这将重定向到您的索引页

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

网页上的

2,您永远不会看到文件扩展名(.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;
    }
}

答案 3 :(得分:15)

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

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

答案 4 :(得分:4)

使用nginx $ is_args而不是?对于GET查询字符串

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

答案 5 :(得分:1)

以下是解决这个问题第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;
    }

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

try_files $ uri $ uri / /index.php = 404; 是从SanjuD的答案中借来的,但如果找不到位置,还需要额外的404重新路由。

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

答案 6 :(得分:0)

如果你想将index.php(没有其他php文件传递给fastcgi)传递给fastcgi,以防你在像codeigniter这样的框架中有这样的路由

$route["/download.php"] = "controller/method";


location ~ index\.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi.conf;
}

答案 7 :(得分:0)

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

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

它的工作对我来说(根据我的经验),意味着你所有的blabla.php都会重写为blabla

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