Ubuntu 14.04LTS下Apache 2配置Shibboleth:SetHandler疑似失效
排查Apache未将Shibboleth.sso请求传递给Shibboleth的问题
看起来你遇到了一个挺棘手的环境差异问题——测试服务器正常,生产环境却把/Shibboleth.sso路径的请求丢给Drupal返回404,我来帮你梳理几个排查方向,应该能帮你定位问题:
1. 先排查Apache重写规则的冲突
你的配置里有一条强制添加 trailing slash 的重写规则,很可能是这条规则先把/Shibboleth.sso改成了/Shibboleth.sso/,后续的逻辑或者Drupal的配置把这个路径接管了:
- 临时验证:先把这条规则注释掉,然后测试访问
https://lib.msu.edu/Shibboleth.sso/Metadata,如果能正常访问,说明就是这条规则的问题。 - 修复方案:给Shibboleth的路径加例外,把下面的规则放在强制trailing slash的规则前面:
解释一下:# 让Shibboleth的路径跳过重写规则 RewriteRule ^Shibboleth\.sso/ - [L] # 原有的强制trailing slash规则 RewriteCond %{REQUEST_METHOD} !=post [NC] RewriteRule ^(.*(?:^|/)[^/\.]+)$ $1/ [L,R=301][L]标记表示匹配到这个路径就停止后续重写,直接交给Location块的SetHandler shib处理。
2. 检查DocumentRoot下的.htaccess文件干扰
你的配置里设置了AllowOverride All,意味着网站根目录下的.htaccess会覆盖Apache的全局配置,而Drupal的.htaccess通常会有大量重写规则,很可能把/Shibboleth.sso的路径拦截了:
- 临时验证:把网站根目录下的
.htaccess重命名为.htaccess.bak,然后测试访问/Shibboleth.sso/Metadata,如果恢复正常,就说明是Drupal的.htaccess搞的鬼。 - 修复方案:在Drupal的
.htaccess里的RewriteEngine On之后,添加Shibboleth路径的例外:RewriteRule ^Shibboleth\.sso/ - [L]
3. 确认Shibboleth模块是否正确加载
虽然测试环境正常,但生产环境可能模块没加载成功:
- 执行命令
apache2ctl -M | grep shib,查看输出里是否有shib2_module (shared); - 如果没有,检查
/etc/apache2/mods-enabled/shib2.load文件是否存在,内容应该是LoadModule shib2_module /usr/lib/apache2/modules/mod_shib2.so(路径可能因安装方式略有不同),如果不存在,执行a2enmod shib2启用模块,然后重启Apache。
4. 查看日志找线索
日志是排查这类问题的关键,别忽略:
- Apache错误日志:默认在
/var/log/apache2/error.log,搜索Shibboleth或者Shibboleth.sso相关的错误信息,看有没有模块加载失败、路径匹配异常的记录; - Shibboleth日志:默认在
/var/log/shibboleth/下,查看shibd.log和native.log,如果日志里没有/Shibboleth.sso相关的请求记录,说明Apache根本没把请求传过去; - 开启重写日志:如果怀疑是重写规则的问题,可以在VirtualHost里添加以下配置(Apache 2.4用
LogLevel alert rewrite:trace3,Apache 2.2用下面的),然后访问目标路径,查看rewrite.log里的规则执行顺序:# Apache 2.2 RewriteLog "/var/log/apache2/rewrite.log" RewriteLogLevel 3 # Apache 2.4 LogLevel alert rewrite:trace3
5. 检查Location块的优先级和冲突
虽然你的配置里写了<Location /Shibboleth.sso>,但要确认有没有其他配置覆盖了它:
- 检查是否有其他VirtualHost或者全局Apache配置里也存在
<Location /Shibboleth.sso>的配置,导致冲突; - 可以把
<Location /Shibboleth.sso>块移到RewriteEngine On配置的前面,确保它的处理优先级更高(Apache的Location和Rewrite处理阶段不同,但有时候调整位置能解决奇怪的优先级问题)。
6. 验证Shibboleth服务本身是否正常
最后确认Shibboleth的核心服务是否在运行:
- 执行
service shibd status,查看服务状态,如果没启动,执行service shibd start,然后重启Apache再测试。
先从重写规则和.htaccess入手吧,这两个是生产和测试环境最容易出现差异的地方,祝你早日解决问题!
内容的提问来源于stack exchange,提问作者Kevin Finkenbinder
相关产品推荐
相关产品推荐

