Php URL目录作为htaccess的变量

Php URL目录作为htaccess的变量,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,我的实际访问权限是 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/这样的最后一个尾随

我的实际访问权限是

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/这样的最后一个尾随斜杠时,我在变量中得到了“client1/”


我怎样才能修好它?我知道htaccess中的第二个条件是查找现有目录并跳过重写规则,但我的服务器上没有“client1”目录

只要求匹配使用整个URL路径:

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

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

只需匹配使用整个URL路径:

# Note the trailing $ on the pattern
RewriteRule ^([_0-9a-zA-Z-]+)?$ index.php?cl=$1 [L]
目前,您的模式会检查请求路径是否以(可选)一个或多个字母、数字和/或下划线和破折号开头,但它不会限制自身。因此,它将匹配
a/b/c/d/e/f/g
,无需投诉。如果变量不应包含模式以外的任何内容,则添加
$
(在本例中表示“字符串结尾”)会限制匹配。

“问题是,当我添加一个最后的尾随斜杠(如sub.domain.com/client1/)时,我在变量中会得到“client1/”

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

$cl = trim( $_REQUEST['cl'], '/' );
或者分解该值以获取所有文件夹(如果斜杠后面有其他名称)

问题是,当我添加一个最后的尾随斜杠,如sub.domain.com/client1/时,我的var中会出现“client1/”

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

$cl = trim( $_REQUEST['cl'], '/' );
或者分解该值以获取所有文件夹(如果斜杠后面有其他名称)


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

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,用户应进入由root.htaccess设置的错误404页面。

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

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,用户应进入由root.htaccess设置的错误404页面。

我已经尝试在末尾添加$,但它返回404页面!请记住,htaccess位于子域中(位于服务器的目录中,而不是根目录中)。这可能是问题所在吗?我已经尝试在末尾添加$,但它返回404页!请记住,htaccess位于子域中(位于服务器的目录中,而不是根目录中)。这可能是个问题吗?问题是我在html页面中有很多相对的URL(js、css等等),它们引用的是client1/dir而不是root!我不能在这些url中使用绝对url(由于某些原因,我现在无法解释)@user1753054什么?您说您的服务器上没有目录
client1
。脚本如何驻留在该目录中?那你为什么不在你的HTML
头部设置一个
?@user1753054Ähm,哪一个改变帮助了你?我在头部使用了这个,它很有效!我的htaccess与beginningproblem一样,我在html页面中有许多相对url(js、css等),它们引用client1/dir而不是root!我不能在这些url中使用绝对url(由于某些原因,我现在无法解释)@user1753054什么?您说您的服务器上没有目录
client1
。脚本如何驻留在该目录中?那你为什么不在你的HTML
头部设置一个
?@user1753054Ähm,哪一个改变帮助了你?我在头部使用了这个,它很有效!我的访问权限与开始时相同