重写规则导致无限重定向循环
Rewrite rules cause infinite redirect loop
我的文件夹结构如下所示:
/var/www/.htaccess
/var/www/site/index.php
/var/www/site/images/test.png
.htaccess
文件如下所示:
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
文件中,则重写规则可能会再次 运行,但我不确定原因或如何防止它。如果文件名尚未 /site/index.php,我尝试在第二个 RewriteRule
之前添加 RewriteCond
以仅 运行 规则,但这会导致所有 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
(因为文件不存在)
第一个 RewriteRule
永远不会被使用,因为 RewriteCond
。它总是错误的。 %{REQUEST_FILENAME}
return 服务器上的完整路径,无文件名。
仅第二条规则就使无限循环将 /site/index.php
重定向到自身。
如果你解释你想要什么,我们会尽力帮助你制作工作的 htaccess
更新
RewriteEngine on
# if file exist only add /site/
RewriteCond %{DOCUMENT_ROOT}/site/%{REQUEST_URI} -f
RewriteRule ^(.+)$ /site/ [L]
# if no /site/ in request rewrite to index.php
RewriteCond %{REQUEST_URI} !^/site/
RewriteRule ^ /site/index.php [L]
我的文件夹结构如下所示:
/var/www/.htaccess
/var/www/site/index.php
/var/www/site/images/test.png
.htaccess
文件如下所示:
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
文件中,则重写规则可能会再次 运行,但我不确定原因或如何防止它。如果文件名尚未 /site/index.php,我尝试在第二个 RewriteRule
之前添加 RewriteCond
以仅 运行 规则,但这会导致所有 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
(因为文件不存在)
第一个 RewriteRule
永远不会被使用,因为 RewriteCond
。它总是错误的。 %{REQUEST_FILENAME}
return 服务器上的完整路径,无文件名。
仅第二条规则就使无限循环将 /site/index.php
重定向到自身。
如果你解释你想要什么,我们会尽力帮助你制作工作的 htaccess
更新
RewriteEngine on
# if file exist only add /site/
RewriteCond %{DOCUMENT_ROOT}/site/%{REQUEST_URI} -f
RewriteRule ^(.+)$ /site/ [L]
# if no /site/ in request rewrite to index.php
RewriteCond %{REQUEST_URI} !^/site/
RewriteRule ^ /site/index.php [L]