旧站点是基于php的,有很多页面被索引,因为我们在新的wp站点中保留相同的URL,但没有。最后是php扩展。。。
假设您的“旧站点”.php 文档不再存在(它们不应该存在),则当前规则块将删除.php 扩展似乎比需要的复杂得多(和/或不正确)。(见下文。)
上述代码也已删除。php也来自管理页面。
好吧,这里有点奇怪。。。您现有的规则块已经排除了包含的任何URL/wp-admin/ - 因此,这应该已经排除了您的管理页面。也排除wp-login.php 您可以简单地修改相同的条件,尽管这似乎是不必要的(见下文)。wp-login.php 不是您需要创建的唯一例外,以这种方式添加许多例外很快就会变得不切实际。
快速评估当前规则块。。。
1. RewriteCond %{REQUEST_URI} !/wp-(content|admin|includes)/ [NC]
2. RewriteCond %{REQUEST_FILENAME} !-d
3. RewriteCond %{REQUEST_FILENAME}\\.php !-f
4. RewriteCond %{THE_REQUEST} ^(.+)\\.php([#?][^\\ ]*)?\\ HTTP/
5. RewriteRule ^(.+)\\.php$ $1 [R=301,L]
如上所述,这已经排除了任何包含的URL
/wp-content/,
/wp-admin/ 或
/wp-includes/. 但是,假设您的旧站点URL都不是以
wp- 那么,为什么不简单地排除任何以
/wp- - 其中自然包括
wp-login.php,
/wp-admin, 等等。可能不仅仅是
wp-login 和
wp-admin 此处需要排除的URL。
为什么需要检查请求是否未映射到文件系统目录?你有以结尾的目录吗.php?! 文件系统检查相对昂贵,这种情况看起来是多余的。
这张支票没有(我认为)你认为它在做什么。前面的注释指出“文件不存在”-这不是此条件的作用。如果是这样的话,你可能就不会问你的问题了。这段代码没有检查“文件不存在”,这实际上是您的主要问题。如果您要求/foo.php 然后该条件检查/foo.php.php 不存在(我肯定不存在),或者如果您要求/foo/bar/baz.php (其中/foo/bar 不作为物理目录存在),然后检查/foo.php 不存在-可能不是目的。
检查的目的THE_REQUEST 服务器变量是为了避免重定向循环-但是,它可以简化(片段标识符永远不会传递给服务器,所以# 从不匹配)。如果旧URL从不包含查询字符串,则可以进一步简化。但是请注意,如果您的旧URL确实包含查询字符串,那么这将当前传递到新的目标URL上-这是您的意图吗?
此重定向仅适用于RewriteBase 稍后在中设置的指令# BEGIN WordPress 部分理想情况下,您可以在替换中包含斜杠前缀,或者包含规范协议+主机名(绝对URL),避免以后可能发生的第二次重定向。
解决方案将以上几点结合在一起,尝试以下方法(不需要<IfModule mod_rewrite.c> 包装器):
RewriteCond %{REQUEST_URI} !^/wp-
RewriteCond %{THE_REQUEST} "^GET /.+\\.php(\\?\\S*)? HTTP/"
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(?!index\\.php$)(.+)\\.php$ /$1 [R=301,L]
在引号中围绕CondPattern(即。
"..
") 避免了在正则表达式中转义空格的需要。
\\S 是一个速记否定字符类,它匹配任何非空白字符。类似[^\\ ] 正如您最初所做的那样。
(?!index\\.php$) - 在RewriteRule 模式确保我们不会在请求被重写到之后尝试处理该请求index.php 由WP前控制器控制。
文件系统检查(实际上只是故障保护)是最后一个条件,因为这是最“昂贵的”,所以只有在其他条件(和RewriteRule 模式(empattern)成功。
测试之前,您需要清除浏览器缓存。最好使用302(临时)重定向进行测试,以避免缓存问题。