Apache 重写规则导致无限重定向循环

Apache 重写规则导致无限重定向循环,apache,.htaccess,mod-rewrite,url-rewriting,Apache,.htaccess,Mod Rewrite,Url Rewriting,我的文件夹结构如下所示: /var/www/.htaccess /var/www/site/index.php /var/www/site/images/test.png RewriteEngine On RewriteCond /site/%{REQUEST_FILENAME} -f RewriteRule ^(.*)$ /site/%{REQUEST_FILENAME} [L] RewriteRule ^(.*)$ /site/index.php [L,QSA] 其中.htaccess文

我的文件夹结构如下所示:

/var/www/.htaccess
/var/www/site/index.php
/var/www/site/images/test.png
RewriteEngine On
RewriteCond /site/%{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ /site/%{REQUEST_FILENAME} [L]
RewriteRule ^(.*)$ /site/index.php [L,QSA]
其中
.htaccess
文件如下所示:

/var/www/.htaccess
/var/www/site/index.php
/var/www/site/images/test.png
RewriteEngine On
RewriteCond /site/%{REQUEST_FILENAME} -f
RewriteRule ^(.*)$ /site/%{REQUEST_FILENAME} [L]
RewriteRule ^(.*)$ /site/index.php [L,QSA]
基本上,我希望将所有URL重写到/site/目录,并让现有文件简单地重写到
site
文件夹中的路径,同时使任何不存在的文件重写为
/site/index.php

上面的
.htaccess
文件适用于
/images/test.png
,但对于
/
它会导致无限循环,如Apache错误日志中所述:

[Sat Jun 13 21:42:04.003016 2015] [core:error] [pid 12949] [client 127.0.0.1:50560] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
[Sat Jun 13 21:42:04.003020 2015] [core:debug] [pid 12949] core.c(3533): [client 127.0.0.1:50560] AH00121: r->uri = /site/index.php
[Sat Jun 13 21:42:04.003022 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003033 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003035 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003037 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003038 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003040 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003041 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003048 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003049 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /site/index.php
[Sat Jun 13 21:42:04.003050 2015] [core:debug] [pid 12949] core.c(3540): [client 127.0.0.1:50560] AH00122: redirected from r->uri = /
根据文档,如果重写规则位于
.htaccess
文件中,出于各种原因,它们可能会再次运行,但我不确定原因,也不知道如何防范。我尝试在第二个
RewriteRule
之前添加一个
RewriteCond
,以仅在文件名尚未为/site/index.php时运行该规则,但这会导致所有URL(甚至现有文件)重写为/site/index.php

为了更清楚地了解我到底想要什么,我希望将以下URI重写为以下路径:

  • /
    -->
    /site/index.php
  • /test
    -->
    /site/index.php
  • /images/test.png
    -->
    /site/images/test.png
    (因为文件存在)
  • /images/bla.png
    -->
    /site/index.php
    (因为该文件不存在)

    • 第一条
      重写规则
      永远不会使用,因为
      重写条件
      。它总是假的<代码>%{REQUEST_FILENAME}返回服务器上的完整路径,无文件名

      仅第二条规则就使得无限循环将
      /site/index.php
      重定向到自身

      如果你解释你想要什么,我们会尽力帮助你让工作顺利进行

      更新

      RewriteEngine on
      
      # if file exist only add /site/
      RewriteCond %{DOCUMENT_ROOT}/site/%{REQUEST_URI} -f
      RewriteRule ^(.+)$ /site/$1 [L]
      
      # if no /site/ in request rewrite to index.php
      RewriteCond %{REQUEST_URI} !^/site/
      RewriteRule ^ /site/index.php [L]
      

      由于
      RewriteCond
      ,将永远不会使用第一条
      RewriteRule
      。它总是假的<代码>%{REQUEST_FILENAME}返回服务器上的完整路径,无文件名

      仅第二条规则就使得无限循环将
      /site/index.php
      重定向到自身

      如果你解释你想要什么,我们会尽力帮助你让工作顺利进行

      更新

      RewriteEngine on
      
      # if file exist only add /site/
      RewriteCond %{DOCUMENT_ROOT}/site/%{REQUEST_URI} -f
      RewriteRule ^(.+)$ /site/$1 [L]
      
      # if no /site/ in request rewrite to index.php
      RewriteCond %{REQUEST_URI} !^/site/
      RewriteRule ^ /site/index.php [L]
      

      @AngeloGeels我也这样回答:)很乐意帮忙。好luck@AngeloGeels我也这样回答:)很乐意帮忙。好luck@AngeloGeels我也这样回答:)很乐意帮忙。祝你好运