如何从/file.php重定向到Nginx上的/ file?

时间:2020-10-01 19:54:34

标签: php ubuntu nginx seo

我目前正在使用以下配置从我的Nginx服务器上的URL隐藏.php扩展名:

location / {
    try_files $uri $uri/ @extensionless-php;
    index index.html index.htm index.php;
}

location ~ \.php$ {
    try_files $uri =404;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
}

location @extensionless-php {
    rewrite ^(.*)$ $1.php last;
}

这工作得很好,但是如何使nginx不允许添加.php扩展名?在我的示例中,如果您手动删除.php,它可以工作,但是如果您添加它,它在URL中将永久保留。

1 个答案:

答案 0 :(得分:0)

要使用HTTP 301代码永久重定向这些请求,请尝试

rewrite ^(.*)\.php$ $1 permanent;

将此指令放在您的location块之前。

更新

回答此问题后,OP提出了另一个问题(现已删除)-如果您具有以下webroot结构:

webroot
|
+-- index.php (PHP file)
|
+-- somename.php (PHP file)
|
+-- somename (folder)
|   |
|   +-- index.php (PHP file)
|
+-- someothername (folder)
    |
    +-- index.php (PHP file)

先前的解决方案无法提供somename.php文件,因为对http://example.com/somename的请求将由try_files伪指令重定向到http://example.com/somename/,并且接下来将与somename/index.php文件。

这可以解决,但是您必须停止使用indextry_files伪指令,并使用您自己的请求处理逻辑来模拟它们的行为。这就是我最终得到的:

map $original_uri $maybe_slash {
    ~/$      '';
    default  '/';
}

server {

    ...

    if ($original_uri = '') {
        set $original_uri $uri;
    }

    # redirect requests of '/somepath/somefile.php' to '/somepath/somefile'
    rewrite ^(.*)\.php$ $1 pemanent;

    location / {

        # this emulates 'try_files $uri $uri/ ...' directive behavior and redirects '/some/path'
        # to '/some/path/' if 'some/path.php' file does not exists, but 'some/path' folder exists
        # and there are 'some/path/index.html' file in that folder
        set $check_redirect $rewrited$maybe_slash;
        if ( $check_redirect = '1/' ) {
           return 301 $original_uri/$is_args$args;
        }

        if ( -f $document_root$uri.php ) { rewrite ^ $uri.php last; }

        # this emulates 'index index.php index.html' directive behavior
        if ( -f $document_root$uri${maybe_slash}index.php ) {
            set $rewrited 1;
            rewrite ^ $uri${maybe_slash}index.php last;
        }
        if ( -f $document_root$uri${maybe_slash}index.html ) {
            set $rewrited 1;
            rewrite ^ $uri${maybe_slash}index.html last;
        }

        # if a request for an absent resource should be served with some backend
        # controller, it is ok to use some 'try_files' directive here like
        # try_files $uri /index.php?path=$original_uri;

    }

    location ~ \.php$ {

        # this emulates 'try_files $uri $uri/ ...' directive behavior and redirects '/some/path'
        # to '/some/path/' if 'some/path.php' file does not exists, but 'some/path' folder exists
        # and there are 'some/path/index.php' file in that folder
        set $check_redirect $rewrited$maybe_slash;
        if ( $check_redirect = '1/' ) {
           return 301 $original_uri/$is_args$args;
        }

        # no 'try_files $uri =404'  or 'include snippets/fastcgi-php.conf' here, this location
        # can be reached only if requested PHP file is really exists in webroot folder
        include fastcgi.conf;
        fastcgi_param SCRIPT_FILENAME $document_root$uri;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

    }

}

使用上述配置和webroot结构

  • http://example.com/的请求将与webroot/index.php文件一起提供;
  • http://example.com/somename的请求将与webroot/somename.php文件一起提供;
  • http://example.com/somename.php的请求将被重定向到http://example.com/somename并与webroot/somename.php文件一起提供;
  • http://example.com/somename/的请求将与webroot/somename/index.php文件一起提供;
  • http://example.com/someothername的请求将被重定向到http://example.com/someothername/(因为不存在webroot/someothername.php文件)并与webroot/someothername/index.php文件一起提供。

有关自定义HTTP错误页面的重要提示

如果您有一些自定义错误页面,例如用于HTTP 404错误的webroot/error/404.php,而不是通常的定义方式,例如

error_page 404 /error/404.php;

您需要跳过该文件的.php扩展名:

error_page 404 /error/404;
相关问题