Regex 这个.htaccess中有什么错误?
使用mod_rewrite,我希望在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
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)