Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex ApacheRewriteCond:如何仅匹配顶级请求(无子目录)_Regex_Apache_.htaccess - Fatal编程技术网

Regex ApacheRewriteCond:如何仅匹配顶级请求(无子目录)

Regex ApacheRewriteCond:如何仅匹配顶级请求(无子目录),regex,apache,.htaccess,Regex,Apache,.htaccess,在一个星期的大部分时间里,我的头都撞到了这个问题上,结果是同一个问题和解决方案,就像这篇文章中所说的: TL;我在某个时候删除了我的404文档。这导致Apache在尝试为新页面提供服务时再次运行规则,但无法运行。在第二次穿越时,它总是符合我的特殊条件 这个正则表达式给我带来了无尽的麻烦,我不知道这是否是因为我遗漏了关于RewriteCond的内容 简单地说,我只想匹配顶级请求,这意味着任何没有子目录的请求。例如,我希望匹配site.com/index.html,但不匹配site.com/subd

在一个星期的大部分时间里,我的头都撞到了这个问题上,结果是同一个问题和解决方案,就像这篇文章中所说的:

TL;我在某个时候删除了我的404文档。这导致Apache在尝试为新页面提供服务时再次运行规则,但无法运行。在第二次穿越时,它总是符合我的特殊条件

这个正则表达式给我带来了无尽的麻烦,我不知道这是否是因为我遗漏了关于RewriteCond的内容

简单地说,我只想匹配顶级请求,这意味着任何没有子目录的请求。例如,我希望匹配site.com/index.html,但不匹配site.com/subdirectory/index.html

我想我可以通过以下方式实现:

RewriteCond %{REQUEST_URI} !/[^/]+/.*
有趣的是,它不起作用,但反过来却起作用。例如:

RewriteCond %{REQUEST_URI} /[^/]+/.*
它将检测何时存在子目录。并且它将省略顶级请求site.com/toplevelurl。但是,当我把感叹号放在前面以反转RewriteCond应该允许的规则时,它停止匹配任何内容

我已经尝试了许多不同风格的正则表达式和不同的模式,但似乎没有一种是有效的。任何帮助都将不胜感激。答案似乎应该回答,但对我不起作用

我也用它进行了测试,我的模式在测试仪中工作,但在实际的服务器上不工作

编辑:根据请求,这是我的.htaccess。它允许不带文件扩展名的URL,还做了一些类似于自定义404页面的事情,尽管它的目的是允许文件名作为参数,而不是404替换

Options +FollowSymLinks

DirectoryIndex index.php index.html index.htm

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}\.html -f 
RewriteRule ^(.*)$ $1.html
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
RewriteCond %{REQUEST_FILENAME} =/home/me/public_html/site/
RewriteRule ^(.*)$ index.php
RewriteCond %{REQUEST_FILENAME} !-f # Below this is where I would like the new rule
RewriteRule ^(.*)$ newurl.php
</IfModule>
我想匹配site.com/index.html,但不想匹配site.com/subdirectory/index.html

您可以使用:

RewriteRule ^[^/]+/?$
或使用“重写条件”:


看起来您跳过了直线起点和终点锚点。为什么?这只是我最近试过的正则表达式;我也试过开始和结束锚,是的。实际上,最终版本应该使用它们,所以我会。RewriteCond%{REQUEST_URI}^/[^/]+/?$不起作用,抱歉。我使用RewriteCond是因为我在RewriteRule中执行其他操作。它对哪个URL不起作用?你能显示你的完整访问权限吗?URL是可变的;它不会检测带有斜杠的URL,这正是我所需要的。我会发布.htaccess。我想我差不多有了。我做了一些测试,它没有返回页面的url,请求uri使用的是404.shtml!尝试将此规则放置在“在线重写引擎”的正下方。还要确保子目录中没有其他htaccess。
RewriteCond %{REQUEST_URI} ^/[^/]+/?$