我的实际.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”目录!
答案 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页面。