我目前使用$_GET['base']
来确定用户访问的主页。
这会产生localhost/?base=administrator
或localhost/?base=guest
我也用它来控制用户所在的页面,例如
localhost/?base=guest&page=register
有没有办法使用mod_rewrite或htaccess来改变这个系统的工作方式? 修改我的代码不是问题,这可能吗?
编辑:
我想要实现这个目标:
localhost/?base=guest
至localhost/guest
localhost/?base=admin
至localhost/admin
localhost/?base=guest&page=register
至localhost/guest/register
以下是我的htaccess文件
RewriteEngine On
RewriteRule ^([^/]*)/([^/]*)$ /?base=$1&page=$2 [L]
RewriteRule ^([^/]*)$ /?base=$1 [L]
文档路径会影响它的调用方式吗?因为我使用case
循环来包含所需的项目。
然而,这适用于localhost
,但它会将每个其他地址循环到main。
RewriteEngine On
RewriteRule ^$ /index.php?base=guest[L]
但没有按预期给出结果。
答案 0 :(得分:1)
.htaccess中的规则需要按相反的顺序排列,如下所示:
RewriteRule ^([^/]*)/([^/]*)$ /?base=$1&page=$2 [L]
RewriteRule ^([^/]*)$ /?base=$1 [L]
这是因为如果它按照你拥有它的顺序保存,localhost/?base=guest&page=register
& localhost/?base=administrator
将匹配规则RewriteRule ^([^/]*)$ /?base=$1
。
以相反的顺序排列它们可确保第一条规则仅与localhost/?base=guest&page=register
匹配。它与localhost/?base=administrator
的第一条规则不匹配。我希望有所帮助。
答案 1 :(得分:1)
所以你可以使用这个简单的代码:
RewriteEngine on
RewriteRule ^(\w+)$ index.php?base=$1 [L]
RewriteRule ^(\w+)/(\w+)$ index.php?base=$1&page=$2 [L]
\w
会匹配符号a-z
,0-9
和下划线_
,我认为这些字符足以满足您的需求,但如果您需要扩展,则很容易< / p>
此外,在这种情况下,您无需更改代码,因为base
数组中的page
和$_GET
参数仍然存在
<强>更新强>
禁用查询字符串参数page
和base
(可能需要其他参数)将这两行添加到底部的代码中:
RewriteCond %{THE_REQUEST} (\?|&)(page|base) [NC]
RewriteRule .* - [L,R=404]
答案 2 :(得分:1)
您需要从规则
中排除现有的文件和文件夹RewriteEngine On
# if the request is a dir
RewriteCond %{REQUEST_FILENAME} -d [OR]
# or file
RewriteCond %{REQUEST_FILENAME} -f
#do nothing
RewriteRule ^ - [L]
RewriteRule ^([^/]*)/([^/]*)$ /?base=$1&page=$2 [L]
RewriteRule ^([^/]*)$ /?base=$1 [L]