在htaccess文件中获取子字符串

时间:2016-06-30 13:04:59

标签: apache .htaccess virtualhost

我有一个问题要做一个htaccess文件。我有这样的URI:

http://www.exemple.com/?fileName=fileName&otherString=otherString

我想执行这样的命令:

<If "file('fileName') !~ /otherString/">
    # do something
</If>

是否可以从URI获取fileName和otherString?

是否可以使用正则表达式获取%{QUERY_STRING}子字符串?还是其他?

提前致谢。

修改:

我不想重写URI(暂时)。 URI包含文本文件的名称(&#34; fileName&#34;),以及此文件中的信息(&#34; otherString&#34;)。我想访问此文件并验证信息是否存在于其中。如果是这样,做我想做的事。

我有这两个正则表达式:

/\?file\=(.*)\&/
/\&otherString\=(.*)$/

在URI中将我想要的两个部分隔离开来。但我不知道如何使用它(如果可能的话)来获取和操作URI的部分字符串。

1 个答案:

答案 0 :(得分:2)

Apache不是最好的工具。

您可以使用正则表达式(如%{QUERY_STRING} =~ /(?:^|&)fileName=([^&]+)&otherString=([^&]+)/)从查询字符串中提取所需参数的值。可以使用反向引用变量$1检索 fileName 的值,对于 otherString $2可以检索

但似乎你不能在正则表达式中重用反向引用变量。

所以,为了完全匹配:

<If "%{QUERY_STRING} =~ /(?:^|&)fileName=([^&]+)&otherString=([^&]+)/ && file(%{DOCUMENT_ROOT} . '/' . $1) == $2">

(对于不匹配,请将==更改为!=

如果字符串可以在文件中的任何位置找到,我能找到的最好的是:

<If "%{QUERY_STRING} =~ /(?:^|&)fileName=([^&]+)&otherString=([^&]+)/ && file(%{DOCUMENT_ROOT} . '/' . $1) -strmatch '*$2*'">

(在!之前添加file(以取消否定)

在其他两个之间添加类似&& -s %{DOCUMENT_ROOT} . '/' . $1的测试可能是一个好主意,以避免错误日志中出现一些无用的噪音。