我的旧网站有大约 25000 个网址,网址中有 abc。
我想在我的 apache conf 中使用 3 个 DBM 文件。
目标是如果 URL 不包含 abc 即。http://example.com/1234.htm
那么我不想查看 abcredirects.DBM 文件。
如果 URL 确实包含 abc 即。http://example.com/abc1234.htm
那么我只想查看 abcredirectsDBM 文件。
我正在尝试在我的 Apache 中使用 if 语句,但是无论何时我使用该<If>
块,我放入的任何内容似乎都被忽略了。
我已经改变了<If "%{REQUEST_URI} =~ m#^abc#">
很多不同的方式,但这没关系。如果我删除<if>
块所有重定向按预期工作。
为什么我的<if>
块被忽略?没有错误,根据日志http://example.com/abc1234.htm
(我假设)没有评估为真,所以我不确定还有什么要检查的。
[root@mail conf]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Jun 27 2018 13:48:59
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteMap abcredirects "dbm:/etc/httpd/conf/dbm/abcredirects.dbm"
<If "%{REQUEST_URI} =~ m#^abc#">
RewriteCond ${abcredirects:$1} !=""
RewriteRule ^(.*) /${abcredirects:$1} [R=301,L]
</If>
RewriteMap shortalias "dbm:/etc/httpd/conf/shortalias.dbm"
RewriteCond ${shortalias:$1} !=""
RewriteRule ^(.*) /${shortalias:$1} [R=301,L]
</IfModule>
<VirtualHost *:80>
DocumentRoot /var/www/sites/me
ServerName example.com
DirectoryIndex index.htm
Options +FollowSymLinks
RewriteEngine On
RewriteOptions Inherit
RewriteMap otherredirects "dbm:/etc/httpd/conf/otherredirects.dbm"
RewriteCond ${otherredirects:$1} !=""
RewriteRule ^(.*) /${otherredirects:$1} [R=301,L]
</VirtualHost>
我见过并尝试过的服务器故障问题:
如果 url 具有特定模式重定向到 https,则 apache 强制
在 Apache 中重定向、更改 URL 或将 HTTP 重定向到 HTTPS - 关于 Mod_Rewrite 规则你想知道但不敢问的一切
REQUEST_URI
服务器变量始终以斜杠(URL 路径的开头)开头,因此正则表达式永远m#^abc#
不会在这里匹配。您需要改用正则表达式m#^/abc#
。(假设这不是您已经尝试过的“不同方式”之一?)我还会避免在 vHost 和服务器之间拆分您的配置 - 除非有特定要求?这使 mod_rewrite 的问题变得复杂,因为虚拟主机上下文中的指令通常会覆盖服务器上下文中的指令,因此您需要使用 mod_rewrite 继承(您正在这样做) - 但这会变得不必要的混乱。(该
inherit
选项继承了当前上下文后面的父指令,这可能不是您所期望的。)您的其余问题似乎与您最近的问题交叉: