Nginx 从变量中删除字符

Nginx 从变量中删除字符

基本上我想要做的是将请求的 URL 放入变量中,然后删除一个字符(如 /)并获取一个新变量。

我正在尝试在 URL 末尾实现尾部斜杠;这可行,但我想对所有文件都执行此操作:

location /examplehtmlfile/ {
   try_files = $uri $uri/ examplehtmlfile.html
}

否则,如果我在末尾添加一个斜杠,就会产生 404 错误。

所以我想要做的是向 try_files 指令(针对主要/位置)添加如下内容:

try_files = $uri $uri/ /$uriwithoutslash.html /$uriwithoutslash.php

谢谢

答案1

$uri如果变量末尾有斜杠,则需要重写变量。这是内部重写因此它不会影响向您的客户显示的 URL。

location ~ ./$ { rewrite ^(.+)/$ $1 last; }

您的主要位置只能测试静态内容的存在。PHP 文件需要在不同的位置块中处理。

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

可以在指定位置测试 PHP 文件是否存在:

location @php {
    try_files $uri.php $uri/index.php =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass ...;
}

可以=404用默认 URI 替换,例如:/index.php

root还需要指令,但没有index参考指令。

编辑:

如果您也需要使用.php扩展来支持 URI,您可以重写它们并添加斜线或复制 PHP 位置块。以下任一方式:

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

或者:

location ~ \.php$ {
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass ...;
}

答案2

感谢@RichardSmith,问题已经解决了!

这是我的最终配置:http://pastebin.com/TdAz9ad9

相关内容