Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.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 使用否定的正则表达式条件重写.htaccess中的cond不';不行?_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Regex 使用否定的正则表达式条件重写.htaccess中的cond不';不行?

Regex 使用否定的正则表达式条件重写.htaccess中的cond不';不行?,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,在本例中,我试图阻止WordPress重写某些URL。在本例中,我试图阻止它处理uploads目录中的请求,而将这些请求留给服务器的404页面。所以我假设这就像添加规则一样简单: RewriteCond %{REQUEST_URI} !^/wp-content/uploads/ 此规则的计算结果应为false,并使这些请求的规则链失败,从而停止重写。但是没有。。。也许我需要匹配表达式中的完整字符串 RewriteCond %{REQUEST_URI} !^/wp-content/uploads

在本例中,我试图阻止WordPress重写某些URL。在本例中,我试图阻止它处理uploads目录中的请求,而将这些请求留给服务器的404页面。所以我假设这就像添加规则一样简单:

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
此规则的计算结果应为false,并使这些请求的规则链失败,从而停止重写。但是没有。。。也许我需要匹配表达式中的完整字符串

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/.*$
不,也不是这样。所以在搔了搔我的头之后,我做了一次精神检查。也许实际的模式有问题。所以我做了一个简单的测试用例

RewriteCond %{REQUEST_URI} ^/xyz/$
在这种情况下,当且仅当请求的URL为/xyz/并且显示服务器的404页面作为任何其他页面时,才会发生重写。这正是我所期望的。所以我会坚持下去!否定这种模式

RewriteCond %{REQUEST_URI} !^/xyz/$
现在我希望看到与上述条件完全相反的情况。重写不应该发生在/xyz/上,而应该发生在其他所有可能的URL上。相反,重写会针对每个URL进行,包括/xyz/和其他URL

所以,要么在重写条件中使用否定正则表达式在Apache中被破坏了,要么有一些基本的东西我不明白。是哪一个

服务器是Apache2

文件全文如下:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/wp-content/uploads/
RewriteRule . /index.php [L]
</IfModule>

重新启动发动机
重写基/
重写规则^index\.php$-[L]
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写cond%{REQUEST_URI}^/wp内容/上传/
重写规则/index.php[L]
WordPress的默认文件加上我的规则。


<IfModule mod_rewrite.c>
RewriteEngine On

RewriteBase /
RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_URI} !^/wp-content/uploads/ [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . /index.php [L]
</IfModule>
重新启动发动机 重写基/ 重写规则^index\.php$-[L] 重写cond%{REQUEST_URI}^/wp内容/上传/[或] 重写cond%{REQUEST_FILENAME}-F 重写cond%{REQUEST_FILENAME}-D 重写规则/index.php[L]
如果
/wp content/uploads/
确实是请求的URI路径的前缀,则您的规则应按预期工作

但是,由于它显然不起作用,请尝试不匹配完整URI路径的路径前缀,而仅匹配不带上下文每目录路径前缀的剩余路径,如果文档根目录中的.htaccess文件,则匹配不带前导的URI路径
/

RewriteCond $0 !^wp-content/uploads/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .+ /index.php [L]

如果这两者都不起作用,那么通过使用它的。因此,将
RewriteLogLevel
设置为至少
4
的级别,提出请求并查看使用指定的日志文件中的条目。在那里你可以看到mod_rewrite是如何处理你的请求的,当
RewriteLogLevel
大于或等于4时,你还可以看到变量的值,比如
%{request_URI}

,所以,在经历了一番恼怒之后,我找到了问题所在。事实证明,我最初的问题中的规则实际上做了它应该做的事情。其他一些做同样事情的方法也是如此,比如

RewriteRule ^wp-content/uploads/.*$ - [L]
(如果模式匹配,则将规则标记为最后一个)或

(如果模式匹配,则跳过下一个规则)以及问题中的否定规则,如前所述。所有这些规则都运行得很好,并将控制权返回给Apache,而无需重写

问题是在处理这些规则之后发生的。相反,问题是我删除了主机提供的默认404.shtml、403.shtml等模板。如果您没有任何.htaccess重写,那就可以了;服务器将提供自己的默认404页面,一切正常。(至少我是这么想的,但实际上这是一个双重错误“此外,在尝试使用ErrorDocument处理请求时遇到了404 Not Found错误。”)

另一方面,当您拥有.htaccess时,它会在404页面上再次执行。如果页面在那里,它将被使用,但是现在,404.shtml的请求被catch all规则捕获并重写为index.php。出于这个原因,我在这里或其他地方得到的所有其他建议都失败了,因为最终404页面被重写为index.php

因此,解决方案只是恢复错误模板。回想起来,删除它们是相当愚蠢的,但我有这种“从头开始”的心态。不要任何看起来不必要的东西到处乱放。至少现在我明白发生了什么,这正是我想要的


最后是对塞西尔的评论:我从来都不想禁止访问任何东西,只是阻止重写的发生。现在这并不重要,但我只是想澄清这一点。

在采用“WordPress优先”方法时,我发现了许多类似的例子。例如,添加:

errordocument404/errordocs/404.html


到.htaccess文件会处理消息(“另外,404未找到错误…”)。

您的重写规则是什么?他们可能有问题……我把整个文件添加到了问题中。这不是我想做的。我想知道这到底是怎么回事,因为同样的问题在各种重写中突然出现,给我带来了一些麻烦。哦,好吧,我想我误解了。你能简单地解释一下吗?我将为您编写完整的.htaccess。好吧,每个带有[L]标志的重写规则都是“LAST”,因此如果模式匹配,它将停止在那里。。您可以在现有的条件/规则下添加另一个条件/规则。因此,它完全符合您的要求,不会影响wordpress的另一个。这就是我要做的:)好的,换言之,我希望每个可能的URL都由index.php处理,除非它以/xyz开头。和其他任何内容都将被重写为index.php,但如果它以/xyz开头,则应该正常处理。可能有文件,也可能没有。好的,试试看。。在你的RewriteCond中添加了一个[或]标志-它的意思是“或”,所以现在看起来像。。如果!不是这个URL[或]这些其他条件,然后重写规则。
RewriteRule ^wp-content/uploads/.*$ - [S=1]