php - HTACCESS 重写不适用于非 WP 目录

标签 php wordpress .htaccess mod-rewrite

我在我的域 example.com 的根文件夹中安装了 WordPress,还有另一个包含自定义 PHP 代码的目录 example.com/control/

在没有安装 WordPress 的情况下,我的 .htaccess 文件将 /control/show.php?id=2 重定向为 /control/2/并且工作得很好,但是一旦我在 root 中安装了 WP,它就不再工作了。

.htaccess:

# 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

/control/.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^control/([^/]*)$ /control/show.php?id=$1 [L,QSA,NC]

请帮助我理解错误以及如何让它工作。

最佳答案

control/.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^control/([^/]*)$ /control/show.php?id=$1 [L,QSA,NC]

这在 /control/.htaccess 文件中不起作用,因为 RewriteRule 指令的编写就像在 .htaccess 中一样> 文档根目录中的文件。

.htaccess 中,RewriteRule pattern 匹配 URL 路径减去目录前缀(导致 . htaccess 文件)。换句话说,它匹配 2/,而不是 control/2/。这就是上述指令不起作用的原因。

不是错误,但您也不需要在替换 中显式声明 /control/ 子目录,因为这会自动添加前缀,前提是您使用相对路径替换。同样,您也不需要 RewriteBase 指令(在这种情况下它可能设置不正确)。

所以,上面的应该写成如下:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)$ show.php?id=$1 [QSA,L]

NC 标志在此示例中也是多余的。

您的正则表达式应该尽可能具体。如果“id”始终是 digits(如您的示例所示),则修改 RewriteRule pattern 以仅匹配数字:^(\d*)$ (0 个或多个数字)。

关于php - HTACCESS 重写不适用于非 WP 目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53551427/

相关文章:

php - Css、图像和 js 在 .htaccess 文件中不起作用

PHP AltoRouter 仅提供基本 URL

php - 在解析参数时从另一个 php 文件调用 php 文件

php - 如何从 WooCommerce 订单项中获取和显示产品自定义字段

sql - WordPress SQL : Selecting posts after a certain date

javascript - 如何获取帖子总页数?

php - 使用 Mod Rewrite 更改 URL 结构

php - Python 到 PHP - Azure 机器学习

php - 用于在 Facebook Like 上显示内容的示例 PHP 或 JS 代码

php - 无法在 Shopware 6 中按多个标签过滤产品