我在更新 Apache 服务器 (httpd、rhel) 中以前工作的重定向时遇到问题。我以前遇到过:
RedirectMatch 301 ^/apidocs/ /old/specific/path/apidocs/
有效。
我将其改为:
RedirectMatch 301 ^/apidocs/ /new/specific/path/apidocs/
现在它不起作用了。也就是说,当我尝试点击简单的http://<主机>/apidocsurl,当浏览器尝试从旧位置进行 GET 时,我会在响应标头中收到带有旧重定向位置的 301 错误,随后收到 404 错误。httpd 错误日志证实浏览器尝试 GET 旧目录:
File does not exist: /var/www/html/old
执行service httpd reload
或service httpd force-reload
仅产生以下单行输出:
Reloading httpd:
...所以它大概是成功的。另外,
(1) 当启动 httpd 时,其错误日志没有任何抱怨。
(2) 运行apachectl configtest
产生Syntax OK
。
(3) 运行httpd -t
产生Syntax OK
。
(4) 我已多次停止并“优雅”启动 httpd,但无济于事。
(5) 我尝试使用 apachectl -k stop/start,但无济于事。
(6)我现在也尝试使用 htcacheclean 清除缓存,但无济于事。
值得注意的是,以前虽然加载了 mod cache 和 mod cache disk 模块,但没有 CacheRoot 等的配置,因此我添加了以下内容:
CacheEnable disk /
CacheRoot "/var/cache/httpd"
CacheDirLength 2
CacheDirLevels 2
...随后验证它是否已被填充并使用 htcacheclean 清除它。
还有什么地方可能还会存在这些过时的 301 数据呢?
谢谢!Hans
答案1
首先,您需要解决语法错误,因此运行httpd -t
,像这样(echo 部分除外),这样您就可以找出哪个配置文件包含语法错误:
[root@wcmisdlin02 conf.d]# echo blah >> php.conf
[root@wcmisdlin02 conf.d]# httpd -t
AH00526: Syntax error on line 33 of /etc/httpd/conf.d/php.conf:
Invalid command 'blah', perhaps misspelled or defined by a module not included in the server configuration
[root@wcmisdlin02 conf.d]#
根据mod_alias - Apache HTTP 服务器版本 2.4,您的RedirectMatch
看起来不错。您访问的虚拟主机正确吗?
答案2
...所以“答案”是问题的前提是错误的。 也就是说,apache httpd 正在正确地完成其工作。真正的问题是服务器上的 httpd 和我的本地机器之间有一个缓存层。 我将此作为证据:
1.从我的本地机器执行的 wget 被重定向到旧的重定向 URL,而
2.从服务器执行的 wget 被正确重定向到新的重定向 URL,
前者的访问日志如下所示:
"GET /old/specific/path/apidocs/ HTTP/1.1" 404
而后者产生:
"GET /apidocs/ HTTP/1.0" 301
"GET /new/specific/path/apidocs/ HTTP/1.0" 200