如何获得没有查询参数的SSI变量REQUEST_URI

问题描述:

我试图获取REQUEST_URI的路径名部分,没有查询参数。我需要在原始SSI中执行此操作,而不需要任何PHP或任何东西。如何获得没有查询参数的SSI变量REQUEST_URI

如果我做了类似<!--#echo var="REQUEST_URI" -->的操作,将输出路径名和查询参数,因此如果浏览器URL显示http://example.com/foo.html?bar,那将返回/foo.html?bar。但我只需要返回/foo.html。有没有办法在echo声明中直接执行此操作?

注意:它只需要使用请求的uri。服务器上的实际文件路径非常不同,我无法显示这些路径。

+0

为什么downvote?这对某人来说不清楚吗? – andi

我没有运行nginxSSI身边,所以我只是在这里猜测。 但也许你可以尝试使用正则表达式来提取你想要的。 也许是这样的:

<!--# if expr="$REQUEST_URI = /(.+)\?.*/" --> 
    <!--# echo var="1" --> 
<!--# endif --> 

我不知道有关\?之前。

+0

谢谢,那工作! – andi

+0

很酷。你最终需要用'\'来逃避'?'吗? – mofoe

+0

是的,我逃过了问号。 – andi

你可以尝试使用DOCUMENT_URI变量而不是:

<!--#echo var="DOCUMENT_URI" --> 

SCRIPT_NAME似乎太工作:

<!--#echo var="SCRIPT_NAME" --> 
+0

谢谢,但是''返回服务器URI,而不是用户输入到浏览器的URI(我们有一些nginx重写使得这些值不同)。和''只返回'(none)'。 – andi

+0

我明白了。奇怪的是'SCRIPT_NAME'显示'(none)'。你尝试过'PATH_INFO'(另一个CGI变量)吗? – mofoe

此代码的工作对我来说:

<!--#if expr="$REQUEST_URI = /([^?]+)\?.*/" --> 
    <!--#set var="URL_WITHOUT_QUERY_STRING" value="$1" --> 
    <!--#echo var='URL_WITHOUT_QUERY_STRING' --> 
<!--#endif -->