如何使用NGINX从url中删除.php和.html扩展名?

时间:2014-02-20 14:51:21

标签: php html nginx

我希望我的nginx make显示所有网址都干净。

通过一些研究,我已经开始研究第一个案例了。它通过以下配置完成:

location / {
    root   html;
    index  index.html index.htm index.php;
    try_files $uri.html $uri/ =404; 
}

它适用于indexhtml.html显示为indexhtml,但.php没有任何反应。如果我将$ uri.html更改为$ uri.php,它既不适用于.html,也不适用于.php。我试图在php位置添加类似的东西,但没有任何成功。

有任何建议吗?

4 个答案:

答案 0 :(得分:42)

无需额外的块和命名位置以及所有内容。同时移动indexoutside the location block

server {
  index index.html index.php;
  location / {
    try_files $uri $uri/ $uri.html $uri.php$is_args$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}

请注意,如果您在同一文件夹中有一个文件夹和同名文件,例如/folder/xyz//folder/xyz.php,则无法运行该文件夹中的php文件xyz包含index.phpindex.html,请记住这一点。

答案 1 :(得分:41)

根据我的研究,如果你附加你的/etc/nginx/conf.d/domain.tld.conf文件包括:

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

location ~ \.php$ {
    try_files $uri =404;
}

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

然后重新启动nginx并试一试。希望这会对你有所帮助!可以找到更多信息(我在哪里找到它)here @ tweaktalk.net

答案 2 :(得分:8)

要进一步Mohammad's answer,您可能还希望提供从.html.php到无扩展版本的重定向。

这是可以实现的,因为$request_uri包含"完整的原始请求URI(带参数)",并且不受用户不可见的内部重写的影响

server {
  index index.html index.php;
  location / {
    if ($request_uri ~ ^/(.*)\.html$) {  return 302 /$1;  }
    try_files $uri $uri/ $uri.html $uri.php?$args;
  }
  location ~ \.php$ {
    if ($request_uri ~ ^/([^?]*)\.php($|\?)) {  return 302 /$1?$args;  }
    try_files $uri =404;
    # add fastcgi_pass line here, depending if you use socket or port
  }
}

答案 3 :(得分:1)

也许这可能对你有用......它很简单并完成工作:

location / {
  rewrite ^/([^\.]+)$ /$1.html break;
}