wordpress 如何修复RewriteMap的问题

62lalag4  于 2023-05-22  发布在  WordPress
关注(0)|答案(1)|浏览(186)

由于某种原因,我的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)

vddsk6oq

vddsk6oq1#

RewriteCond     ${redirectsmap:$1}     >""     [NC]
RewriteRule     ^(.*) ${redirectsmap:$1}     [R=301,L]

Map文件包含(类似于此,但有数千个条目):

/main /article-main/name 
/article/search /search

这就是问题所在,您没有将存储在Map文件中的相同URL路径传递到重写Map。在.htaccess上下文中,RewriteRule * 模式 * 匹配的URL路径不是以斜杠开头的,所以实际上传递的是main(而不是/main),它与Map文件中的URL路径不匹配。(但是,这将在 * 服务器 * 或 * 虚拟主机 * 上下文中工作。
请尝试以下操作:

RewriteCond ${redirectsmap:/$1} (.+)
RewriteRule (.*) %1 [R=301,L]

不需要两次调用重写Map,因为你可以在 condition 中捕获返回值,并在 substitution 字符串中使用反向引用%1
并且不需要 condition 上的NC标志或RewriteRulepattern 上的^前缀。
除非您也重定向根目录(主页),否则请将RewriteRule * 模式 * 从(.*)更改为(.+)-以避免不必要地匹配主页。
(Test首先使用302 - temporary - redirect,以避免潜在的缓存问题。
或者,使用REQUEST_URI服务器变量:

RewriteCond ${redirectsmap:%{REQUEST_URI}} (.+)
RewriteRule ^ %1 [R=301,L]

(同样,如果不重定向主页,则将RewriteRule * 模式 * 从^更改为.

相关问题