由于某种原因,我的RewriteMap不起作用。
设置为:
- Apache Pre VirtualHost包含
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什么也不做。有什么想法吗?
(服务器是一个Linux VPS运行WHM/Cpanel上CentOs7 /网站是WordPress上PHP 8 / DNS背后CloudFlare)
1条答案
按热度按时间vddsk6oq1#
Map文件包含(类似于此,但有数千个条目):
这就是问题所在,您没有将存储在Map文件中的相同URL路径传递到重写Map。在
.htaccess
上下文中,RewriteRule
* 模式 * 匹配的URL路径不是以斜杠开头的,所以实际上传递的是main
(而不是/main
),它与Map文件中的URL路径不匹配。(但是,这将在 * 服务器 * 或 * 虚拟主机 * 上下文中工作。请尝试以下操作:
不需要两次调用重写Map,因为你可以在 condition 中捕获返回值,并在 substitution 字符串中使用反向引用
%1
。并且不需要 condition 上的
NC
标志或RewriteRule
pattern 上的^
前缀。除非您也重定向根目录(主页),否则请将
RewriteRule
* 模式 * 从(.*)
更改为(.+)
-以避免不必要地匹配主页。(Test首先使用302 - temporary - redirect,以避免潜在的缓存问题。
或者,使用
REQUEST_URI
服务器变量:(同样,如果不重定向主页,则将
RewriteRule
* 模式 * 从^
更改为.
。