如何在重定向时在Cookie中设置SHA1哈希值?
解决方案
一、编写与Apache兼容的SHA1外部脚本
Apache内置的sha1()函数会输出小写的40位十六进制SHA1哈希值,你的sha1.sh脚本只要实现相同的输出格式即可。以下是两种可靠写法:
写法1:基于openssl实现
#!/bin/bash while read input; do echo -n "$input" | openssl sha1 | awk '{print $2}' done
echo -n确保不添加额外换行符(Apache的sha1()处理字符串时不会包含末尾换行)openssl sha1输出格式为SHA1(stdin)= abcdef...,用awk提取纯哈希部分
写法2:基于sha1sum实现
#!/bin/bash while read input; do echo -n "$input" | sha1sum | awk '{print $1}' done
- 同样用
echo -n避免换行影响哈希结果 sha1sum输出的第一列就是标准小写SHA1哈希
脚本写完后记得添加执行权限:
chmod +x /var/www/mydomain/sha1.sh
同时确保Apache进程拥有该脚本的执行权限。
二、更简便的无外部脚本实现
如果你的Apache版本是2.4.10及以上,完全可以不用外部脚本,利用Apache内置函数先把哈希存入环境变量,再用环境变量设置Cookie:
RewriteEngine On # 先计算SHA1哈希并存入环境变量 RewriteRule ^needCheck$ - [E=MY_SHA1:${sha1:%{myVar}}] # 用环境变量设置Cookie并重定向 RewriteRule ^needCheck$ /check [L,R=302,CO=myCookie:%{ENV:MY_SHA1}:.mydomain.com]
这种方式全程依赖Apache内置能力,避免了外部脚本的维护和权限问题。
三、校验环节的注意事项
后续用<If>指令校验时,要确保两点:
- 正确提取Cookie中的哈希值(SHA1哈希是十六进制字符,无需解码)
- 计算的
sha1('%{myVar}')与Cookie值完全匹配(注意大小写、无额外字符)
示例校验配置:
<If "%{HTTP_COOKIE} =~ /myCookie=([a-f0-9]{40})/ && sha1('%{myVar}') == $1"> # 校验通过后的业务逻辑 </If>
内容的提问来源于stack exchange,提问作者hf409
相关产品推荐
相关产品推荐

