.htaccess不适用于特定情况

.htaccess不适用于特定情况,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,在使用.htaccess文件时,我遇到了一个奇怪的问题 这是我的档案: <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteRule ^(admin)($|/) - [L] RewriteRule ^$ ./web/view/ RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1 RewriteRule ^([A-Za-z0-9]+)/$

在使用.htaccess文件时,我遇到了一个奇怪的问题

这是我的档案:

<IfModule mod_rewrite.c>
Options +FollowSymlinks

RewriteEngine On

RewriteRule ^(admin)($|/) - [L]

RewriteRule ^$ ./web/view/
RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/$ ./web/view/?module=$1
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)$ ./web/view/?module=$1&id1=$2&id2=$3
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/([0-9]+)/$ ./web/view/?module=$1&id1=$2&id2=$3
RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)$ ./web/view/?module=$1&id1=$2
RewriteRule ^([A-Za-z0-9]+)/([0-9]+)/$ ./web/view/?module=$1&id1=$2

ErrorDocument 404 err.php

</IfModule>
但是,如果我使用
A-Z
,它可以正常工作

RewriteRule ^([A-Za-z0-9]+)/([A-Z0-9]+)/$ ./web/view/?module=$1&id1=$2
甚至
[NC]
也给了我同样的错误

你能帮我找出并纠正这个问题吗

现在在最后一条规则中,如果我将
[a-z]
[0-9]
一起添加,我将得到一个500错误。例如,下一行将给我500个错误:

RewriteRule ^([A-Za-z0-9]+)/([a-z0-9]+)/$ ./web/view/?module=$1&id1=$2
原因是重写引擎将进入无限循环:

  • 请求URI看起来像
    /something/id/
    (注意后面的斜杠)
  • 它与规则匹配:
    RewriteRule^([A-Za-z0-9]+)/([A-z0-9]+)/$。/web/view/?module=$1&id1=$2
  • URI被重写为
    /web/view/?module=something&id=id
  • 新URI被放回重写引擎,新URI=
    /web/view/
  • URI与(相同)规则匹配:
    RewriteRule^([A-Za-z0-9]+)/([A-z0-9]+)/$。/web/view/?module=$1&id1=$2
  • URI被重写为
    /web/view/?module=web&id=view
  • 重复步骤4
  • 您需要添加一个条件以防止其循环:

    RewriteCond %{REQUEST_URI} !/web/view
    RewriteRule ^([A-Za-z0-9]+)/([A-Za-z0-9]+)/$ ./web/view/?module=$1&id1=$2
    

    我的第一反应是在每个重写行的末尾添加一个[L],例如:

    RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1 [L]
    
    RewriteRule ^$ ./web/view/ [L,QSA]
    
    这很好,因为您的重写是相互独立的

    第二步是合并每组RewriteRule指令,其中正斜杠(/)是可选的,因此不是:

    RewriteRule ^([A-Za-z0-9]+)$ ./web/view/?module=$1
    RewriteRule ^([A-Za-z0-9]+)/$ ./web/view/?module=$1
    
    同样可以肯定地说:

    RewriteRule ^([A-Za-z0-9]+)/?$ ./web/view/?module=$1
    
    问号(?)表示0或1,但不超过前面的字符、组或表达式

    最后,您可以考虑优化ReWrruleRead指令组:

    <IfModule mod_rewrite.c>
    Options +FollowSymlinks
    
    RewriteEngine On
    
    RewriteRule ^(admin)($|/) - [L]
    
    RewriteRule ^$ ./web/view/ [L]
    RewriteRule ^([A-Za-z0-9]+)/?((([A-Za-z0-9]+)/?)?(([A-Za-z0-9]+)/?)?)?$ ./web/view/?module=$1&id1=$4&id2=$6 [L]
    
    ErrorDocument 404 err.php
    
    </IfModule>
    

    您也可以考虑使用,帮助您创建、测试或排除正则表达式。

    最后,在.htaccess文件中,根据AllowOverrides指令的定义,您可以启用:

    但是,根据您的apache服务器版本或配置,您可能需要使用RewriteLog/级别,因为RewriteLog/级别已被弃用:

    LogLevel alert rewrite:trace4
    
    作为免责声明,此级别的日志记录将降低您的Web服务器的速度,因此不要在生产环境中启用太长时间

    LogLevel alert rewrite:trace4