我有一个简单的。htaccessfile
DirectoryIndex index.php
RewriteEngine On
RewriteRule ^v4r.info/(.*)/(.*) v4r.info/NGOplus/index.php?NGO=$1&page=$2 [L,QSA]
我在htaccess.madewithlove.com中测试了这个文件,它给出了一个正确的结果,并且复制粘贴结果完美无缺。(http://localhost/v4r.info/NGOplus/index.php?NGO=action-for-woman&页面= board.list.php& ff = 710;;;;;, startdate可以= 2017-11-11)
但是在本地主机上htaccess失败,报错:
File does not exist:
/var/www/html/public_html/v4r.info/action-for-woman/board.list.php
测试URL为
localhost/v4r.info NGOplus/index . php ?非政府组织= action-for-woman&页面= board.list.php& ff = 710;;;;;, startdate可以= 2017-11-11
htaccess已激活。(垃圾线给出"内部服务器错误")
在另一个目录htaccess工作正常
apache.conf seems ok (AllowOverride All)
补充道:
htaccess文件不在基本目录中,而是在目录1。子目录(v4r.info)。
是什么工作是htaccess在v4r.info/NGOplus与符号链接"为妇女行动"到ngo +RewriteRule ^ (. + ?)/?$ index . php ?页面= 1美元(L, QSA)
在这里,apache做了一个"本地"重写,即只是URL的最后一部分(目录名'action-for-woman'我必须从$_SERVER中提取…)
我的。htaccess文件在v4r.info目录下,不是根目录。
在这种情况下,您的规则将永远不会匹配。RewriteRule
模式匹配相对于包含.htaccess
文件的目录的url路径。
但是无论如何,重写不是递归的。
是的,它是"递归的"。在目录上下文中(即。.htaccess
)。重写引擎"循环"重复,直到URL不变地通过,或者您已经显式地设置了END
(Apache 2.4)。
试试下面的命令:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !index.php$
RewriteRule ^([^/]+)/([^/]+)$ /v4r.info/NGOplus/index.php?NGO=$1&page=$2 [L,QSA]
对REDIRECT_STATUS
环境变量的检查是为了确保只重写直接请求,而不是已经重写的请求。
然而,这种模式仍然过于通用,因为它匹配任意两个路径段。我设置了第二个检查index.php
的条件,这样您就可以直接请求/v4r.info/NGOplus/index.php
(就像您在测试中所做的那样)。然而,这可以通过使正则表达式更具体来避免。