重写所有请求nginx的的index.php(Rewrite all requests to ind

2019-06-18 13:35发布

在我的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;
}

Answer 1:

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


Answer 2:

完美的解决方案我已经尝试过了,并成功让我的索引页时,我有我的站点配置文件添加该代码。

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

在配置文件本身解释说,“第一次尝试以服务请求的文件,然后根据目录,然后退回到index.html的在我的情况下,它是作为的index.php我通过PHP代码提供页面。



Answer 3:

要通过GET变量,以及使用$args

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


Answer 4:

扁平,简单的配置不重写,在某些情况下工作:

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


Answer 5:

使用nginx的$ is_args代替? 对于GET查询字符串

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


Answer 6:

这里是什么工作对我来说,解决这个问题的第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 /永久; 重写非文件地址(地址,而不文件扩展名)有一个“/”结尾。 我这样做是因为我遇到了“拒绝访问”。 消息时,我尝试没有它来访问该文件夹。

try_files $ URI $ URI /的index.php = 404; 从SanjuD的回答借来的,但有一个额外的404重新路由,如果位置仍然没有找到。

fastcgi_index index.php文件; 是,我错过了拼图的最后一块。 该文件夹并没有重新路由到的index.php没有这条线。



Answer 7:

如果您想通过刚才的index.php文件(没有其他PHP文件将被传递到的FastCGI)FastCGI的情况下,你有这样的航线一样笨的框架

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


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


Answer 8:

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

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

这对我来说(根据我的经验)工作,这意味着所有的blabla.php将改写成布拉布拉

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



文章来源: Rewrite all requests to index.php with nginx