如何解决 RewriteMap 的问题

问题描述 投票:0回答:1

出于某种原因,我的 RewriteMap 无法正常工作。

设置是:

  • Apache Pre VirtualHost Include
RewriteEngine On
RewriteMap redirectsmap dbm:/home/sitename/hredirects.db
  • .htaccess 是:
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]
  • map 文件包含(与此类似但有数千个条目):
/main /article-main/name 
/article/search /search

我已经在 Apache Pre VirtualHost Include 和 .htaccess 文件中测试了正常的 3xx 重定向,它工作正常,但由于某种原因,RewriteMap 什么都不做……请问有什么想法吗?

(服务器是在 CentOs7 上运行 WHM/Cpanel 的 linux VPS / 网站是 PHP 8 上的 Wordpress / CloudFlare 背后的 DNS)

wordpress apache .htaccess mod-rewrite url-rewriting
1个回答
0
投票
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-地图文件中的路径。 (然而,这将在 servervirtualhost 上下文中工作。)

请尝试以下操作:

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
^
更改为
.
。)

© www.soinside.com 2019 - 2024. All rights reserved.