如何使用多个变量在mod_rewrite htaccess中定位目录?

时间:2013-04-14 11:04:59

标签: php .htaccess mod-rewrite

我想对根目录和管理目录使用单个.htaccess文件。

在尝试拥有干净的网址时,我想在管理员位于URI中时使用admin/index.php文件。否则使用根目录index.php

这就是我所拥有的,它适用于第一个变量(例如localhost / admin / users),但如果我放置第二个变量(例如localhost / admin / users / add_user),则会产生404。 / p>

请帮忙或简化,我把头发拉出来......

RewriteEngine on

# Remove trailing '/'
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/$ /$1 [R,L]

RewriteRule ^admin/?$ /admin/index.php
RewriteRule ^admin/([a-zA-Z0-9-]+)/?$ /admin/index.php?controller=$1 [QSA]
RewriteRule ^admin/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/?$ /admin/index.php?controller=$1&method=$2 [QSA]
RewriteRule ^admin/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/?$ /admin/index.php?controller=$1&method=$2&id=$3 [L,QSA]

RewriteRule ^([a-zA-Z0-9-]+)/?$ /index.php?controller=$1 [QSA]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/?$ /index.php?controller=$1&method=$2 [QSA]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/?$ /index.php?controller=$1&method=$2&id=$3 [QSA]

1 个答案:

答案 0 :(得分:0)

localhost/admin/users/add_user不起作用的原因是因为您正在捕获 add_user 分组的正则表达式为([a-zA-Z0-9-]+)。请注意,在匹配的字符集中,_不是其中之一。这就是为什么规则不适用,因为正则表达式不匹配。您可以尝试使其更加通用:

RewriteRule ^admin/?$ /admin/index.php
RewriteRule ^admin/([^/]+)/?$ /admin/index.php?controller=$1 [QSA]
RewriteRule ^admin/([^/]+)/([^/]+)/?$ /admin/index.php?controller=$1&method=$2 [QSA]
RewriteRule ^admin/([^/]+)/([^/]+)/([^/]+)/?$ /admin/index.php?controller=$1&method=$2&id=$3 [L,QSA]

RewriteRule ^([^/]+)/?$ /index.php?controller=$1 [QSA]
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?controller=$1&method=$2 [QSA]
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/?$ /index.php?controller=$1&method=$2&id=$3 [QSA]

基本上,用([a-zA-Z0-9-]+)替换所有([^/]+)