使用重写规则从url中删除.php

时间:2013-11-14 10:27:34

标签: php nginx

我想重写nginx中的url,以便可以省略.php扩展名。

这就是我所拥有的,但这对我不起作用。任何人都知道如何做到这一点?

感谢。

  server {
        listen 80;
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;       
}

server {
        listen   80;
        root /usr/share/nginx/www;
        index index.php;
        server_name www.example.com;
        error_page 404 http://www.example.com/404.php;
        autoindex off;
        error_log  /usr/share/nginx/www/nginx_error.log  warn;

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

    location = / {
        rewrite ^ /index.php;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }

}

这是我的整个配置文件。

3 个答案:

答案 0 :(得分:3)

花了一段时间试图让它正常工作。 php文件和其他资产都在工作:

location / {

    if (!-e $request_filename){
        rewrite ^(.*)$ /$1.php;
    }
    try_files $uri $uri/ /index.php?$query_string;
}

答案 1 :(得分:2)

@Makromat我认为您在评论中提到的404问题是您的/位置正在解析为/.php而没有文件名,因此要解决此问题,我们可能会添加另一个位置来处理这个特例

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

试试这个并告诉我它是否有效

修改

好了,我有一个更好的主意,如果原始网址已包含.php扩展名,第一种情况将会失败,因此最好将其定义为后备解决方案,试试这个

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

尝试将其替换为您当前的php块

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
}

答案 2 :(得分:0)

这样的事情应该是你想要的。

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