我在我的域 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/