将所有 URL 重定向到根目录,/wp-admin 和 wp-json 除外

将所有 URL 重定向到根目录,/wp-admin 和 wp-json 除外

我尝试将除 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

让我们看看你的规则起什么作用。

  1. 您启用重写引擎来设置每个目录重写的基本 URL。没问题。

    RewriteEngine On
    RewriteBase /
    
  2. 然后,您声明不应-进行替换/index.php。那也没问题。

    RewriteRule ^index\.php$ - [L]
    
  3. 其余条件导致最后一行的规则被应用。

    /只要文件或目录不存在,或者请求 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

相关内容