重写后无法访问$ _GET?

时间:2011-08-20 03:05:08

标签: php .htaccess mod-rewrite

这是我的.htaccess的mod_rewrite部分     

Options +FollowSymlinks

Options -Indexes

# Prevent Direct Access to files
<FilesMatch "\.(tpl|ini)">
 Order deny,allow
 Deny from all
</FilesMatch>

# SEO URL Settings
RewriteEngine On
RewriteBase /mysite/

# Protects file paths
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mysite/index.php?route=$1 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ /mysite/index.php?route=$1&page=$2 [NC,QSA,L]

</IfModule>

当我输入http://localhost/mysite/home时,它正确地将我带到index.php?route=home

当我输入http://localhost/mysite/services/时,它再次有效,我可以正确访问$_GET['route']

所以例如,我的菜单有:

<li<?php if($_GET['route'] == 'home') { echo ' class="selected"'; ?>>

在该页面上设置课程。

但是......

当我输入http://localhost/mysite/services/widget时,它正确地将我带到index.php?route=home&page=widget,但如果我尝试引用$_GET['page'](或任何$_GET值,则会出现PHP错误问)...正如我之前提到的,我用来设置菜单项的selected类。

有人可以帮我解决这个问题吗?我必须在第二次重写时做错了...因为它没有获取任何$_GET值。

...

这真的很奇怪,因为我使用$_GET['route']$_GET['page']来填充页面的正确html(类似于MVC设置)......我会想到php include如果找不到$_GET

,我在index.php上会失败

...

修改

也许它是相关的,但我的index.php代码如下所示:

if( isset( $_GET[ 'route' ] )) {
    if( file_exists( 'content/' . $_GET[ 'route' ] . '.php' )) {
      if( isset( $_GET[ 'page' ] )) {
        if( file_exists( 'content/' . $_GET[ 'route' ] . '/' . $_GET[ 'page'] . '.php' )) {
          include 'content/' . $_GET[ 'route' ] . '/' . $_GET[ 'page'] . '.php';
        }
      } else {
        include 'content/' . $_GET[ 'route' ] . '.php'; 
      }
    } else {
      header( "Location:404" );
      exit;
    }
  } else {
    header( "Location:home" );
    exit;
  }

3 个答案:

答案 0 :(得分:2)

你的改写规则互相争斗;他们都被设置为在完全相同的条件下行事。我不是mod_rewrite专家,但对我来说这似乎是一个明显的问题。

答案 1 :(得分:2)

我认为你的重写规则顺序是个问题。你应该首先拥有最具体的规则然后放入通用规则。如果你改变你的.htaccess:

RewriteBase /mysite

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ /mysite/index.php?route=$1&page=$2 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /mysite/index.php?route=$1 [NC,QSA,L]

并确保您在mysite / .htacess文件中包含以上代码。

如果您访问http://localhost/mysite/services/widget并执行print_r($_GET);,您将获得:

Array
(
    [route] => services
    [page] => widget
)

答案 2 :(得分:0)

这很奇怪。如果您的GET变量存在于URL中,PHP应该能够抓取它们。尝试堆叠这样的重写,看看它是否有帮助:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ index.php?route=$1&page=$2 [NC,QSA,L]
RewriteRule ^(.*)$ index.php?route=$1 [NC,QSA,L]