mod_rewrite正在影响$ _GET

时间:2018-07-23 15:53:07

标签: .htaccess mod-rewrite

我的.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的值

1 个答案:

答案 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.phpindex.php都应该也位于/site/文件夹中。