我尝试将除 wordpress 管理和 wordpress REST API 之外的所有 URL 重定向到根目录。
我的 中有以下规则.htaccess
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin.*
RewriteCond %{REQUEST_URI} !^/wp-json.*
RewriteRule ^.*$ / [L,R=301]
</IfModule>
/wp-json
除了我收到 404 错误的路由之外,它对所有重定向都完美起作用。
另外,我的 apache 日志文件中有以下错误类型:
File does not exist: [...]/dmjob/wp-json, referer: http://dmjob.dev:8888/
你能帮帮我吗?非常感谢!:)
答案1
你似乎被毁坏WordPress 前端控制器,因此对/wp-admin
和的任何请求/wp-json
都将无法正确路由(因此您会看到 404)。
您应该保留 WP 指令,但在文件开头实现额外的重定向。例如:
# Redirect all requests for non-existent files and those not for wp-admin or wp-json
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-admin
RewriteCond %{REQUEST_URI} !^/wp-json
RewriteRule ^ / [R=301,L]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
请注意,与原始代码一样,只有在请求不存在的文件时才会重定向请求,即使该文件位于 URL 空间之外/wp-admin
。/wp-json
(据推测这是必需的,以便 CSS、JS、图像和任何其他静态资源仍能正确提供。)
答案2
让我们看看你的规则起什么作用。
您启用重写引擎来设置每个目录重写的基本 URL。没问题。
RewriteEngine On RewriteBase /
然后,您声明不应
-
进行替换/index.php
。那也没问题。RewriteRule ^index\.php$ - [L]
其余条件导致最后一行的规则被应用。
/
只要文件或目录不存在,或者请求 URL 不存在,就会/wp-admin.*
重定向到/wp-json.*
:RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^/wp-admin.* RewriteCond %{REQUEST_URI} !^/wp-json.* RewriteRule ^.*$ / [L,R=301]
这些都没有问题。urlhttp://example.com/wp-json/
和下面的任何内容均不符合最后一个条件,因此RewriteRule
不适用。
该404 Not Found
错误表明您/wp-json
根本没有 。日志中的(人类可读的)错误表明了同样的情况。如果您没有最后一条规则,那么前两条不存在文件的规则就会得到满足,从而导致重定向到/
。最后一条规则可以阻止此重定向,从而导致404
。