Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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中有什么错误?_Regex_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Regex 这个.htaccess中有什么错误?

Regex 这个.htaccess中有什么错误?,regex,apache,.htaccess,mod-rewrite,Regex,Apache,.htaccess,Mod Rewrite,使用mod_rewrite,我希望在assets目录中查找所有请求的文件,否则返回到index.php进行API调用。这是我的.htaccess RewriteEngine on RewriteRule ^.+\.[^/]+$ assets/$1 [L] RewriteRule .* index.php 资产文件由最后一个url段是否具有文件扩展名决定,即没有斜杠的点。我已经测试过了,它似乎工作得很好 不幸的是,使用这些重写规则,所有请求都会导致500内部服务器错误。我知道mod_rewrit

使用mod_rewrite,我希望在
assets
目录中查找所有请求的文件,否则返回到
index.php
进行API调用。这是我的
.htaccess

RewriteEngine on
RewriteRule ^.+\.[^/]+$ assets/$1 [L]
RewriteRule .* index.php
资产文件由最后一个url段是否具有文件扩展名决定,即没有斜杠的点。我已经测试过了,它似乎工作得很好


不幸的是,使用这些重写规则,所有请求都会导致
500内部服务器错误
。我知道mod_rewrite的设置是正确的,因为省略第二行可以正常工作。

您需要添加一个条件以防止重写引擎循环:

RewriteEngine on
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^.+\.[^/]+$ assets/$1 [L]
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule .* index.php
重写引擎循环直到URI停止更改,并且由于
*
也匹配
index.php
,它将继续循环该规则,直到达到内部递归限制为止,您将得到一个500错误

此外,您可以添加不会重新路由现有文件或目录的条件:

RewriteEngine on
RewriteCond %{REQUEST_URI} !index\.php
RewriteRule ^.+\.[^/]+$ assets/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php
试试这些规则:

RewriteEngine on

# rewrite to assets/file if file exists in assets dir
RewriteCond %{DOCUMENT_ROOT}/assets/$1 -f
RewriteRule ^(.+?\.[^/]+)/?$ assets/$1 [L]

# otherwise rewrite to index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^assets/ index.php [NC,L]

可能是一个重定向循环。您需要首先查看错误日志以了解有关500错误的更多信息,然后可能从第二个匹配规则中排除
index.php
。@MichaelBerkowski在匹配规则后不应该停止
[L]
标志吗?这很有效,谢谢。仅就我的理解而言,我需要第一个
重写规则中的正则表达式做什么?我想上面的重写cond已经给出了这一点。此外,我不能省略第二个重写条件吗?我明确表示不希望在资产目录之外传递文件。实际上,第2条规则中的
RewriteCond
可以省略,没有任何问题。很抱歉,没有回答您的第一个问题<第一条规则中的code>RewriteCond
是为了确定资产目录中确实存在该文件,然后regex将捕获
$1
中的URI,感谢您的澄清。然而,在知道文件存在之后,我们不能更容易地捕获URI吗?我认为只要
*
就行了,但那不起作用。@danijar:完全同意即使
^(+)$
也足够了(我只是从问题中复制了正则表达式,没有对其进行篡改:P)