Regex MOD_REWRITE的行为不符合预期

Regex MOD_REWRITE的行为不符合预期,regex,mod-rewrite,Regex,Mod Rewrite,这不起作用: RewriteRule ^([^/]+)([/]?)$ /index.cgi?l=$1 [NC,L] RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L] 这不起作用: RewriteRule ^([^/]+)([/]?)$ /index.cgi?l=$1 [NC,L] RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L] .htaccess文件中没有其他规则。以下是完整的版本: Options

这不起作用:

RewriteRule ^([^/]+)([/]?)$ /index.cgi?l=$1 [NC,L]
RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L]
这不起作用:

RewriteRule ^([^/]+)([/]?)$ /index.cgi?l=$1 [NC,L]
RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L]
.htaccess文件中没有其他规则。以下是完整的版本:

Options -Indexes
Options ExecCGI
AddHandler cgi-script .cgi .pl .q
ErrorDocument 500 /error500.cgi
ErrorDocument 404 /error404.cgi
Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteRule ^([^/]+)/?$ /index.cgi?l=$1 [NC,L]
这确实管用,但这不是我想要的

RewriteRule ^([^/]+)/([^/]+)$ /index.cgi?l=$1&a=$2 [NC,L]

我希望第一个斜杠和第二个目录都是可选的。为什么问号不能像预期的那样匹配0或1个实例?我在这里疯了…

通过使用
$
,您指定它是文本的结尾,因此它与
/
后面的任何内容都不匹配。(在正则表达式中,
^
指定字符串的开头,
$
指定结尾)

您可以删除
$
,然后它将使第二个参数成为可选参数-这听起来像您正在寻找的

尝试此操作以查看您的mod_重写是否正常工作:

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [R,L]

你说的“不起作用”到底是什么意思?从开头开始,解释你要做的事情。对不起,我正在尝试将“目录”名称作为变量传递给CGI脚本。但第二个“目录”可能会被请求,也可能不会像前面的正斜杠那样被请求。
code
RewriteRule^([a-z]+)/?([a-z]+)/index.cgi?l=$1&a=$2[NC,l]
code
生成以下Apache错误页面:发现文档已移到此处。[与请求的链接相同]此外,尝试使用ErrorDocument处理请求时遇到500内部服务器错误。Apache/1.3.37服务器在www.mysite.org端口80Hmm,我想知道是否需要
$
。所以试试这个:
RewriteRule^([^\/]+)\/?(.+)?$
,它应该会给你第一个/的内容。我尝试了你的建议。这次我设置了R标志,这样它就可以重定向,我可以看到它的去向,这是我得到的URL(自己准备好):它正在测试整个URL??嗯,这是非常不寻常的行为。试着做一些简单的事情,比如看你的mod_重写是否正常工作:。。。补充我的答案,因为评论无法格式化。这就是我的想法!在过去的几天里,我一直在与MOD_重写作斗争,一直都在得到完全出乎意料的结果和错误。要么我厚得像两块木板,要么模块完全违反直觉,要么我的服务器软件有点搞笑!!谢谢你的帮助。:)