出于某种原因,我的 RewriteMap 无法正常工作。
设置是:
RewriteEngine On
RewriteMap redirectsmap dbm:/home/sitename/hredirects.db
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond ${redirectsmap:$1} >"" [NC]
RewriteRule ^(.*) ${redirectsmap:$1} [R=301,L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
/main /article-main/name
/article/search /search
我已经在 Apache Pre VirtualHost Include 和 .htaccess 文件中测试了正常的 3xx 重定向,它工作正常,但由于某种原因,RewriteMap 什么都不做……请问有什么想法吗?
(服务器是在 CentOs7 上运行 WHM/Cpanel 的 linux VPS / 网站是 PHP 8 上的 Wordpress / CloudFlare 背后的 DNS)
RewriteCond ${redirectsmap:$1} >"" [NC] RewriteRule ^(.*) ${redirectsmap:$1} [R=301,L]
map 文件包含(与此类似但有数千个条目):
/main /article-main/name /article/search /search
这就是问题所在,您没有将相同的 URL 路径传递给存储在地图文件中的重写地图。在
.htaccess
上下文中,RewriteRule
pattern 匹配的 URL 路径不以斜杠开头,因此您有效地传递了 main
(不是 /main
),它无法匹配 URL-地图文件中的路径。 (然而,这将在 server 或 virtualhost 上下文中工作。)
请尝试以下操作:
RewriteCond ${redirectsmap:/$1} (.+)
RewriteRule (.*) %1 [R=301,L]
无需调用重写映射两次,因为您可以在 condition 中捕获返回值,并在
substitution字符串中使用反向引用
%1
。
并且不需要
NC
标志condition或^
前缀RewriteRule
pattern.
除非您还重定向根目录(主页),然后将
RewriteRule
pattern 从 (.*)
更改为 (.+)
- 以避免不必要地匹配主页。
(首先使用 302 - 临时 - 重定向进行测试,以避免潜在的缓存问题。)
或者,使用
REQUEST_URI
服务器变量:
RewriteCond ${redirectsmap:%{REQUEST_URI}} (.+)
RewriteRule ^ %1 [R=301,L]
(同样,如果不重定向主页,则将
RewriteRule
pattern 从 ^
更改为 .
。)