Nginx 重写以从文件中删除 .php 无效,但会重定向到主页

Nginx 重写以从文件中删除 .php 无效,但会重定向到主页

我正在尝试重写以从我的 URL 中删除 .php,但目前还没有成功。以下是我目前得到的结果以及使用此配置的结果。

location ~ \.php$ {
  try_files $uri/ @extensionless-php;
  include fastcgi_params;
  fastcgi_pass hhvm;
  fastcgi_cache_bypass $skip_cache;
  fastcgi_no_cache $skip_cache;
  fastcgi_cache ASPS;
fastcgi_cache_valid 200 60m;
}

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

这导致:

example.com/page1.php 转到 example.com/page1.php 并正确呈现 example.com/page1 呈现 index.php example.com/page1/ 呈现 index.php

有人遇到过这种情况吗?这似乎是一件很常见的事情,但我为此烦恼了好几个小时,并在网上搜索了无数次。

谢谢你的帮助!

答案1

您的location ~ \.php$块看不到类似的 URI,example.com/page1因为它们与正则表达式不匹配。

你应该将你的try_files $uri/ @extensionless-php;指令放到不同的位置 - 通常location /(它将看到所有的 URI除了.php以)结尾的

尝试这样的操作:

location / {
    try_files $uri $uri/ @extensionless-php;
}

location ~ \.php$ {
    if ($request_uri ~ (.*)\.php$) { 
        return 301 $1; 
    }

    try_files $uri =404;

    include fastcgi_params;
    fastcgi_pass hhvm;
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
    fastcgi_cache ASPS;
    fastcgi_cache_valid 200 60m;
}

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

编辑:为了从以 结尾的 URL 中删除扩展名.phplocation ~ \.php$块需要区分外部呈现的 URL 和内部重写。实现这一点的一种方法是$request_uri使用if块进行测试。请谨慎使用,因为外部重写.phpURL 可能会破坏某些应用程序,尤其是在 POST 表单时。

相关内容