Php 内部服务器错误/带有.htaccess的无限循环 动机
我正在尝试以以下格式重定向URL:Php 内部服务器错误/带有.htaccess的无限循环 动机,php,apache,.htaccess,mod-rewrite,url-rewriting,Php,Apache,.htaccess,Mod Rewrite,Url Rewriting,我正在尝试以以下格式重定向URL: http://myapp/page-subpage-id.htm http://myapp/page-subpage.htm http://myapp/page.htm 对下列事项: http://myapp/?page=page&sub=subpage&id=id http://myapp/?page=page&sub=subpage http://myapp/?page=page 初始解 我的.htaccess文件中有此内容: 重新编写引擎打开 重写规
http://myapp/page-subpage-id.htm
http://myapp/page-subpage.htm
http://myapp/page.htm
对下列事项:
http://myapp/?page=page&sub=subpage&id=id
http://myapp/?page=page&sub=subpage
http://myapp/?page=page
初始解
我的.htaccess
文件中有此内容:
重新编写引擎打开
重写规则^([^-]*)-([^-]*)-([^-]*)\.htm$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)\.htm$./?页面=$1&sub=$2&%{QUERY\u STRING}[L]
重写规则^([^/]*)\.htm$./?页面=$1&%{QUERY\u STRING}[L]
重写cond%{SCRIPT_FILENAME}-F
重写cond%{SCRIPT_FILENAME}-D
重写规则^(.*)./index.php?页面=404&url=$1&%{QUERY\u STRING}
它工作得很好。但现在我的要求变成了这样:
http://myapp/page-subpage-id.htm
http://myapp/page-subpage.htm
http://myapp/page.htm
http://myapp/page-subpage-id
http://myapp/page-subpage
http://myapp/page
应重定向到:
http://myapp/?page=page&sub=subpage&id=id
http://myapp/?page=page&sub=subpage
http://myapp/?page=page
http://myapp/?page=page&sub=subpage&id=id
http://myapp/?page=page&sub=subpage
http://myapp/?page=page
问题
因此,我将.htaccess
文件更改为三种变体:
变体一
重新编写引擎打开
重写规则^([^-]*)-([^-]*)-([^-]*)\.htm$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)\.htm$./?页面=$1&sub=$2&%{QUERY\u STRING}[L]
重写规则^([^/]*)\.htm$./?页面=$1&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)-([^-]*)$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)$。/?页面=$1&sub=$2&%{QUERY_STRING}[L]
重写规则^([^/]*)$./?页面=$1&%{QUERY\u STRING}[L]
重写cond%{SCRIPT_FILENAME}-F
重写cond%{SCRIPT_FILENAME}-D
重写规则^(.*)./index.php?页面=404&url=$1&%{QUERY\u STRING}
变式二
重新编写引擎打开
重写规则^([^-]*)-([^-]*)-([^-]*)$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)$。/?页面=$1&sub=$2&%{QUERY_STRING}[L]
重写规则^([^/]*)$./?页面=$1&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)-([^-]*)\.htm$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)\.htm$./?页面=$1&sub=$2&%{QUERY\u STRING}[L]
重写规则^([^/]*)\.htm$./?页面=$1&%{QUERY\u STRING}[L]
重写cond%{SCRIPT_FILENAME}-F
重写cond%{SCRIPT_FILENAME}-D
重写规则^(.*)./index.php?页面=404&url=$1&%{QUERY\u STRING}
变式三
重新编写引擎打开
重写规则^([^-]*)-([^-]*)-([^-]*)\.htm$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)\.htm$./?页面=$1&sub=$2&%{QUERY\u STRING}[L]
重写规则^([^/]*)\.htm$./?页面=$1&%{QUERY\u STRING}[L]
重写cond%{SCRIPT_FILENAME}-F
重写cond%{SCRIPT_FILENAME}-D
重写规则^([^-]*)-([^-]*)-([^-]*)$。/?页面=$1&sub=$2&id=$3&%{QUERY\u STRING}[L]
重写规则^([^-]*)-([^-]*)$。/?页面=$1&sub=$2&%{QUERY_STRING}[L]
重写规则^([^/]*)$./?页面=$1&%{QUERY\u STRING}[L]
重写规则^(.*)./index.php?页面=404&url=$1&%{QUERY\u STRING}
问题
但当我这样做时,我会遇到以下问题:
在Apache日志中:
[Mon-Jul 21 12:02:13.598400 2014][core:error][pid 2520:tid 860][client 127.0.0.1:52488]AH00124:由于可能的配置错误,请求超出了10个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“日志级别调试”获取回溯。
[Mon Jul 21 12:04:00.803400 2014][core:error][pid 2520:tid 848][client 127.0.0.1:52507]AH00124:由于可能的配置错误,请求超出了10个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“日志级别调试”获取回溯。
[Mon Jul 21 12:04:00.864400 2014][core:错误][pid 2520:tid 848][client 127.0.0.1:52508]AH00124:由于可能的配置错误,请求超出了10个内部重定向的限制。如有必要,使用“LimitInternalRecursion”增加限制。使用“日志级别调试”获取回溯。
问题
解决方案
重新编写引擎打开
#从堆栈溢出
RewriteCond%{REQUEST_FILENAME}-d[或]
RewriteCond%{REQUEST_FILENAME}-f
重写规则^-[L]
重写规则^([^-]+)-([^-]+)-([^.]+)(\.ptf)?$./?页面=$1&sub=$2&id=$3&[L,NC,QSA]
重写规则^([^-]+)-([^.]+)(\.ptf)?$./?页面=$1&sub=$2&[L,NC,QSA]
重写规则^([^.]*)(\.ptf)$./?页面=$1&[L,NC,QSA]
重写规则^(.*)./index.php?页面=$1&[L,QSA]
无限循环
没有条件阻止这样的规则
RewriteRule ^([^/]*)$ ./?page=$1&%{QUERY_STRING} [L]
一次又一次地重写自己。重写后,L
通知mod rewrite
,文件中将不再检查进一步的规则。但这并不是过程的终点。重写的url现在再次通过相同的.htaccess
,直到没有任何内容可以重写。^(.*)$
很高兴再次捕获url,并将其循环
在.htaccess
的顶部,您需要的是一条规则,即如果请求的url是现有文件夹或文件,则不应重写该url
尝试在所有其他规则之前添加此规则:
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteRule ^ - [L]
重定向到/?page=etc
后,url的路径部分指向存在的文件夹。因此,满足了RewriteCond%{REQUEST_FILENAME}-d
。RewriteRule^-[L]
触发,保持url不变。和mod rewrite
退出,无需进一步循环。尝试此变体:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^([^-]+)-([^-]+)-([^.]+)(\.htm)?$ ./?page=$1&sub=$2&id=$3 [L,NC,QSA]
RewriteRule ^([^-]+)-([^.]+)(\.htm)?$ ./?page=$1&sub=$2& [L,NC,QSA]
RewriteRule ^([^.]+)\.htm$ ./?page=$1 [L,NC,QSA]
RewriteRule ^(.*)$ ./index.php?page=404 [L,QSA]
如果我这样说的话,所有链接都显示404!这不管用!在前两种情况下效果非常好。但不适用于
/page
!:(好的,如果我像重写规则那样重写^