在一周的大部分时间里反对这个问题之后,事实证明是同样的问题和解决方案,就像在这个帖子中一样: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>
答案 0 :(得分:0)
我想匹配
site.com/index.html
,但不匹配site.com/subdirectory/index.html
您可以使用:
RewriteRule ^[^/]+/?$
或使用RewriteCond
:
RewriteCond %{REQUEST_URI} ^/[^/]+/?$