2017-02-19 41 views
1

使用.htaccess我希望将%{PATH_INFO}转换为用于引导的查询字符串参数。但我想阻止访问者手动输入引导参数。删除某些查询字符串参数,除非通过重写添加

所以这个输入的URL: www.example.com/user/pictures?id=65

实际上显示: www.example.com?bootstrap=/user/pictures & ID = 65

但如果手动输入

此输入的URL: www.example.com?bootstrap=/user/pictures &我d = 65

删除它: www.example.com?id=65

或显示错误: 404:未找到

最好的情况下

手动输入的引导被忽略,并且%{PATH_INFO}成为一个新的参数。

所以这个: www.example.com/user/pictures?id=65 &引导= somecrap

显示: www.example.com?id=65 &引导= /用户/图片

阻止手动输入的引导程序参数有两个原因。 1)安全。我们不希望用户狩猎和啄食不打算显示的文件。 2)冲突。我们不想在手动输入的引导程序和正确的%{PATH_INFO}之间进行选择。

删除引导参数很容易。像...

RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

添加参数很容易。 (我的是更复杂,但这给出了这个概念。)

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI}%{PATH_INFO} (.*?)(/.+)\2$ 
RewriteRule ^(.*)$ /%1?bootstrap=%2 [QSA,L] 

如果htaccess的刚跑一次通过,这两个片段会做的伎俩。但是,相反,每次重写后,htaccess都会重新启动,并且我添加的引导参数会再次被删除。

我知道quick-n-dirty的修复方法是将[END]添加到第二条规则,但是这不会在这里工作。

我需要的是一种从原始请求中删除?“bootstrap = xxx”的方法,而不是从重写的请求中删除。

感谢

回答

3

要认识到,如果这是原来的请求或没有,你可以检查某些REDIRECT_变量

REDIRECT_ environment variables are created from the environment variables which existed prior to the redirect. They are renamed with a REDIRECT_ prefix, i.e., HTTP_USER_AGENT becomes REDIRECT_HTTP_USER_AGENT .

REDIRECT_URL , REDIRECT_STATUS , and REDIRECT_QUERY_STRING are guaranteed to be set, and the other headers will be set only if they existed prior to the error condition.

你的情况

所以,你可能会检查REDIRECT_STATUSREDIRECT_QUERY_STRING看,如果这是一个外部或内部请求。仅

删除bootstrap=,如果这是一个外部请求,即REDIRECT_QUERY_STRING是空

RewriteCond %{REDIRECT_QUERY_STRING} ^$ 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

另一种方法将是类似的,但现在检查变量是空的,例如

RewriteCond %{REDIRECT_QUERY_STRING} . 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

您也可以检查一个特定的值,如果这是适当的。

+0

非常好的使用'REDIRECT_QUERY_STRING' ++ – anubhava

2

做到这一点的方法是设置环境变量上一个成功的改写,您可以用E标志做。因此,像这样:

RewriteRule ^example$ ?param=example [E=rewritten:1] 

然后,您可以检查它的状态:

RewriteCond %{ENV:rewritten} !=1 

或者:

RewriteCond %{ENV:rewritten} =1 

然而,在.htaccess使用这个时候你要小心,因为如果通过.htaccess文件完成并且生成了内部重定向,则生成的所有环境变量都将得到REDIRECT_前缀t他们。因此,对于后续的经过,还需要在大多数情况下,检查是否存在,或者只是说,如果你的规则是上面在其中添加环境变量:

RewriteCond %{ENV:REDIRECT_rewritten} !=1 

或者:

RewriteCond %{ENV:REDIRECT_rewritten} =1 

参考: