Apache RewriteCond:如何只匹配顶级请求(没有子目录)

时间:2015-04-02 19:24:06

标签: regex apache .htaccess

在一周的大部分时间里反对这个问题之后,事实证明是同样的问题和解决方案,就像在这个帖子中一样:RewriteCond in .htaccess with negated regex condition doesn't work?

TL; DR:我在某个时候删除了我的404文档。这导致Apache在尝试提供新页面时再次执行规则并且无法执行。在第二次旅行中,它总是符合我的特殊条件。


我对这个正则表达式有着无穷无尽的麻烦,而且我不知道是不是因为我错过了一些关于RewriteCond或者什么的东西。

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

我以为我能用这个完成它:

RewriteCond %{REQUEST_URI} !/[^/]+/.*

有趣的是,它不起作用但反过来。例如:

RewriteCond %{REQUEST_URI} /[^/]+/.*

这将检测子目录的时间。它将省略顶级请求(site.com/toplevelurl)。但是当我把惊叹号放在前面以反转规则(RewriteCond应该允许)时,它会停止匹配任何东西。

我尝试了许多不同风格的正则表达式和不同的模式应该可行,但似乎没有。任何帮助,将不胜感激。 this Stack Overflow答案似乎应该回答它但对我不起作用。

我还使用此.htaccess rule tester对其进行了测试,我的模式在测试人员中工作,他们只是不在实际服务器上工作。


编辑:根据要求,这是我的.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>

1 个答案:

答案 0 :(得分:0)

  

我想匹配site.com/index.html,但不匹配site.com/subdirectory/index.html

您可以使用:

RewriteRule ^[^/]+/?$

或使用RewriteCond

RewriteCond %{REQUEST_URI} ^/[^/]+/?$