You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在重定向时在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 10:00:07