用于删除.php扩展名(wp登录和wp-admin除外)的.htaccess重写规则

时间:2019-10-17 作者:MMK

这是我现在的.htaccess:

# Remove filename extension
<IfModule mod_rewrite.c>
# This will remove the .php extension if it is not a directory, the file does not exist and it\'s not a WordPress specific admin page
RewriteCond %{REQUEST_URI} !/wp-(content|admin|includes)/ [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\\.php !-f
RewriteCond %{THE_REQUEST} ^(.+)\\.php([#?][^\\ ]*)?\\ HTTP/
RewriteRule ^(.+)\\.php$ $1 [R=301,L]
</IfModule>

# BEGIN rlrssslReallySimpleSSL rsssl_version[3.2.5]
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
</IfModule>
# END rlrssslReallySimpleSSL


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

</IfModule>
# END WordPress
代码通过删除.php 扩展Google已经索引的URL,并将其重定向到新的URL。但是.php 扩展wp-login, 和其他wp-admin URL也会被删除。

所以我想给URL添加一个例外/wp-login.php 或以下wp-admin 目录

1 个回复
最合适的回答,由SO网友:MrWhite 整理而成

旧站点是基于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-loginwp-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(临时)重定向进行测试,以避免缓存问题。

相关推荐

更改语言URL格式后的HtAccess重定向

更改URL语言格式后http://my-site.com/name-of-page/?lang=en http://my-site.com/name-of-page/?lang=ru 至http://my-site.com/en/name-of-page/ http://my-site.com/ru/name-of-page/ 我想将以前的URL版本重定向到实际版本。我在网上找到了这个代码片段,显然它部分解决了我的问题。<IfModule mod_rewrite.