这是我的.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代码如下所示:
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;
}
答案 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]