Php 内部服务器错误/带有.htaccess的无限循环 动机

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文件中有此内容: 重新编写引擎打开 重写规

我正在尝试以以下格式重定向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
文件中有此内容:

重新编写引擎打开
重写规则^([^-]*)-([^-]*)-([^-]*)\.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
    !:(好的,如果我像重写规则那样重写^