使用htaccess将URL目录作为变量

时间:2012-10-18 13:14:10

标签: php .htaccess mod-rewrite

我的实际.htaccess是

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([_0-9a-zA-Z-]+)? index.php?cl=$1 [L]

当我输入类似sub.domain.com/client1的东西时它工作正常(然后我在我的PHP代码中正确获取$ cl变量)。问题是当我添加一个像sub.domain.com/client1/这样的最终尾部斜杠时,我在我的var中得到“client1 /”!

我该如何解决?我知道我的htaccess中的第二个条件是查找现有目录并跳过重写规则,但我的服务器上没有“client1”目录!

3 个答案:

答案 0 :(得分:1)

“问题是当我添加一个像sub.domain.com/client1/这样的最终尾部斜线时,我在我的var中得到了”client1 /“!

这是预期的行为。您需要在之后通过PHP剥离斜杠:

$cl = trim( $_REQUEST['cl'], '/' );

或者您触发该值以获取所有文件夹(如果斜杠后面还有其他名称)

$cl = explode( '/', $_REQUEST['cl'] );

答案 1 :(得分:0)

只需要匹配消耗整个URL路径:

# Note the trailing $ on the pattern
RewriteRule ^([_0-9a-zA-Z-]+)?$ index.php?cl=$1 [L]

目前,您的模式会检查请求路径是否以(可选)一个或多个字母,数字和/或下划线和短划线字符开头 - 但它不会限制自身。因此它会在没有投诉的情况下匹配a/b/c/d/e/f/g。如果变量从不包含除模式之外的任何内容,则添加$(在本例中为“字符串结尾”)会限制您的匹配。

答案 2 :(得分:0)

我正在尝试做一些非常相似的事情,这对我有用:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([^\/]+)$ index.php?arg1=$1&arg2=default [L]
RewriteRule ^([^\/]+)\/$ index.php?arg1=$1&arg2=default [L]
RewriteRule ^([^\/]+)\/([^\/]+)$ index.php?arg1=$1&arg2=$2 [L]
RewriteRule ^([^\/]+)\/([^\/]+)\/$ index.php?arg1=$1&arg2=$2 [L]

如果找到条件,则重写规则将退出,因此这将逐步检查每个较长的URL路径。

不是仅对“_0-9a-zA-Z-”字符进行过滤,而是允许所有字符不是“/”,因为在每个参数之间我查找文字“/”。

您可以根据需要为多个参数扩展它。对于超出此规则接受的参数数量的URL,应该将用户转到根目录.htaccess设置的错误404页面。