我正在尝试重写以从我的 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 中删除扩展名.php
,location ~ \.php$
块需要区分外部呈现的 URL 和内部重写。实现这一点的一种方法是$request_uri
使用if
块进行测试。请谨慎使用,因为外部重写.php
URL 可能会破坏某些应用程序,尤其是在 POST 表单时。