1

我实际的 .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”目录!

4

3 回答 3

1

“问题是当我添加一个像 sub.domain.com/client1/ 这样的最后一个斜杠时,我会在我的 var 中得到“client1/”!”

这是预期的行为。之后您需要通过 PHP 去除斜线:

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

或者您分解该值以获取所有文件夹(如果斜线后有另一个名称)

$cl = explode( '/', $_REQUEST['cl'] );
于 2012-10-18T13:18:43.983 回答
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 页面。

于 2013-03-22T09:14:28.870 回答
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毫无怨言地匹配。如果变量不应该包含除模式以外的任何内容,则添加$(在这种情况下表示“字符串结尾”)会限制您的匹配。

于 2012-10-18T13:18:10.453 回答