如何使用 .htaccess 将 /wp-admin/admin.php?page=something 重写为 /wp-admin/something

How to rewrite /wp-admin/admin.php?page=something to /wp-admin/something using .htaccess

我正在尝试配置我的 .htaccess,以便当有人导航到路径 /wp-admin/admin.php?page=something 时,路径 /wp-admin/something 会显示在浏览器中,而内容来自 /wp-admin/admin.php?page=something已送达。

如果我导航至 /wp-admin/admin.php?page=something,则该页面会正确提供。但是,/wp-admin/something 不提供内容,而是显示我站点中的默认 404 页面。

我的 .htaccess 配置:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?wp-admin/?$ /wp-admin/admin.php?page= [L]

RewriteBase /
ReWriteCond %{ENV:ENVIRONMENT} !^development$
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{HTTP_HOST}/ [R,L]
</IfModule>

RedirectMatch 301 ^/kundeoplysninger https://signup.kredslob.dk/kundeoplysninger
RedirectMatch 301 ^/mobilepay /

# BEGIN WordPress
# The directives (lines) between "BEGIN WordPress" and "END WordPress" are
# dynamically generated, and should only be modified via WordPress filters.
# Any changes to the directives between these markers will be overwritten.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

when someone navigates to the path /wp-admin/admin.php?page=something, the path /wp-admin/something is shown in the browser

这需要外部重定向。这对于独立键入(或跟随外部 link)到“旧”(page=something) URL 的用户来说是可以的,但必须更新任何内部 links指向所需的规范 URL,即。 /wp-admin/something.

RewriteEngine 指令后立即添加以下内容:

# Redirect direct requests for "/wp-admin/admin.php?page=something" to "/wp-admin/something"
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{QUERY_STRING} ^page=([^&]+)
RewriteRule ^(wp-admin)/admin\.php$ //%1 [QSD,R=301,L]

</code> 反向引用包含从 URL 路径捕获的“wp-admin”(只是保存重复),<code>%1 反向引用包含查询中的“某物”字符串,在前面的 RewriteCond 指令中捕获。

需要 QSD 标志 (Apache 2.4+) 才能从重定向响应中删除查询字符串。

必须检查 REDIRECT_STATUS 环境变量以防止重写的请求(见下文)被重定向。仅重定向来自客户端的直接请求。

and the content from /wp-admin/admin.php?page=something is served

在上述重定向之后,我们需要在内部将请求 /wp-admin/something 重写回服务器可以理解的格式,即。 /wp-admin/admin.php?page=something.

在上述重定向后添加以下内容

# Rewrite "/wp-admin/something" back to "/wp-admin/admin.php?page=something"
RewriteRule ^(wp-admin)/([^.]+)$ /admin.php?page= [L]

捕获正则表达式 ([^.]+) 排除了点,因此它自然地避免了 admin.php 形式的匹配请求,从而防止重写循环。另一种方法是避免重写映射到物理文件的请求,但文件系统检查相对昂贵,因此最好尽可能避免。