Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.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
Php .htaccess重写在匹配完成后继续进行_Php_.htaccess_Mod Rewrite - Fatal编程技术网

Php .htaccess重写在匹配完成后继续进行

Php .htaccess重写在匹配完成后继续进行,php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,首先,我要说的是,htaccess和mod_重写并不是我最好的领域。我已经编写了一个供个人使用的php MVC框架,在文档根中我有一个名为“public”的文件夹,用于css、js、图像等。每个HTTP请求都会根据“public”中的文件进行检查,如果存在,它会发送该文件;否则,它将重定向到框架的index.php 规则起作用,但如果在“public”中进行匹配,它仍然会路由到index.php。如果我注释掉重定向到index.php的最后一行,css和js将正确加载。我不能让它在“公开”匹配完

首先,我要说的是,htaccess和mod_重写并不是我最好的领域。我已经编写了一个供个人使用的php MVC框架,在文档根中我有一个名为“public”的文件夹,用于css、js、图像等。每个HTTP请求都会根据“public”中的文件进行检查,如果存在,它会发送该文件;否则,它将重定向到框架的index.php

规则起作用,但如果在“public”中进行匹配,它仍然会路由到index.php。如果我注释掉重定向到index.php的最后一行,css和js将正确加载。我不能让它在“公开”匹配完成后停止处理

提前谢谢

Options +FollowSymLinks
RewriteEngine On

#If file exists as public resource
RewriteCond %{DOCUMENT_ROOT}/public/$1 -f
RewriteRule ^(.*) %{DOCUMENT_ROOT}/public/$1 [NC,L]


#Redirect everything else to index.php
RewriteRule ^(.*) index.php [NC,L]

您需要添加一个测试来查看请求是否已经指向公共目录,如果没有,则仅触发重写规则:

RewriteCond %{REQUEST_URI} !^/public/
RewriteRule ^.*$ index.php
请注意,
[L]
(“last”)标志经常被误解。它会停止在当前过程中进一步测试和修改的请求,但不能阻止Apache从一开始就通过整个规则集运行新修改的请求(这将发生,因为.htaccess规则从顶部应用到每个新的或修改的请求)。因此,您需要添加RewriteCond指令,以检查您是否正在处理在规则集的上一个过程中指向公用文件夹的请求


有关更多详细信息,请参阅。[请注意,Apache 2.4提供了
[END]
标志,该标志将停止进行另一次重写处理的请求,但此新标志在Apache 2.2及更早版本中不可用。]

看起来您正在进行一些不必要的检查,而且每次执行重写时都会触发新的规则传递,这一事实也让你大吃一惊

也许试试这样的

RewriteEngine On

# pass through anything in the domain.com/public directory
RewriteRule ^/public/(.*)$ - [NC,L]

# route everything else to index
RewriteRule ^(.*)$ index.php [NC,L]
在第一次通过时,应该通过公共目录中的任何内容,其他所有内容都需要通过2次才能解决第二条规则,AFAIK。我认为主要的技巧是提供一个不会触发重写的路由,这样就不会触发第二次传递


也请记住,除非你打算将括号中的内容改写为$1、$2,…

是的,我确实理解[L]标签,我只是迫不及待地想,也许我可以做点什么哈哈。[END]标记对我的妈妈不起作用:(但是你说的没有被指向是有意义的,我看看它是否有效:)谢谢你。简单有效。如果要阻止直接访问/public中的文件(即仅允许在重写后访问),请参阅的答案。哦,我从来不知道括号的事情:)很高兴知道!我玩我的规则已经有一段时间了,您可能需要在最后一条规则之前添加另一条规则,如
RewriteRule^index\.php$-[NC,L]
,以防止在最后一条规则上连续循环。我认为这会给apache日志带来一个错误,类似于太多的重写。我会检查:)适当注意(额外的文本,因为我不能提交简短的评论。哈哈)