我的.htaccess文件具有以下.htaccess重写规则:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /site/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# RewriteRule ^materia/([^/]+)/?$ article.php?slug=$1 [L,NC]
RewriteRule ^([^/]+)/?$ index.php?slug=$1 [L]
</IfModule>
在PHP类中,我有一个检测URL是否具有特定变量的函数:
if (isset($_GET['slug'])) {
$slug = $_GET['slug'];
$file = 'partials/'.$slug.'.php';
} else {
$slug = 'home';
$file = 'partials/home.php';
}
一切正常。但是,当我从第二条规则中删除#时,当URL为http://website.test/site/
时,该函数开始返回index.php
作为变量slug
的值
答案 0 :(得分:1)
But when I remove the # from the second rule, the function start to return index.php as a value from variable slug when the URL is http://website.test/site/
请参考我对上一个问题(https://stackoverflow.com/a/51479577/3181248)的回答。实际上,RewriteCond
仅 应用于下一个(未注释)RewriteRule
。取消注释时,由于==>上一次规则一次又一次地匹配index.php
,因为没有文件夹/文件条件,因此存在透明的无限重写循环。
实际上,这是您的/site/.htaccess
(请确保它位于该文件夹中)的样子
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /site/
# if either a physical folder or file, don't touch it
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
# your rules here...
RewriteRule ^materia/([^/]+)/?$ article.php?slug=$1 [L,NC]
RewriteRule ^([^/]+)/?$ index.php?slug=$1 [L]
</IfModule>
注意:当然,文件article.php
和index.php
都应该也位于/site/
文件夹中。