htaccess 重写规则

htaccess 重写规则

好吧,我将这段代码放入了我的 .htaccess 文件中

  Options +FollowSymlinks
    RewriteEngine on

    AddDefaultCharset UTF-8
    RewriteCond %{THE_REQUEST} ^[A-Z]+\ (.+)\.php  [NC]
    RewriteCond %{THE_REQUEST} !/?admincp/?((.)|(\.)*)
    RewriteRule [^/php/error\.php] /php/error.php  [L,NS]

    # Otherwise check if root request and rewrite to /php/index.php
    RewriteRule ^(/?)$ /php/index.php  [L,NS]
    RewriteCond %{THE_REQUEST} !\.php$  [NC]
    RewriteCond %{REQUEST_URI} !/?admincp/?((.)|(\.)*)
    RewriteRule ^([a-z|_]+)/?$ /php/index.php?categorie=$1 [L,NC,NS]
    RewriteCond %{THE_REQUEST} !\.php$  [NC]
    RewriteCond %{REQUEST_URI} !/?admincp/?(.*)
    RewriteRule ^([a-z|_]+)/([a-z|_|0|1|2|3|4|5|6|7|8|9]+)/?$ /php/index.php?categorie=$1&subcategorie=$2 [L,NC,NS]
    RewriteCond %{REQUEST_URI} !/?admincp/?(.*)
    RewriteCond %{THE_REQUEST} !\.php$  [NC]
    RewriteRule ^([a-z|_]+)/([a-z|_|0|1|2|3|4|5|6|7|8|9]+)/([^/]+)\.html$ /php/index.php?categorie=$1&subcategorie=$2&article=$3 [L,NC,NS]
    ErrorDocument 404 /php/index.php?categorie=apps&subcategorie=error404

我试图将第 6 行更改为以下内容:

  RewriteRule [^/php/index\.php\?categorie=apps&subcategorie=error404] /php/index.php?categorie=apps&subcategorie=error404  [L,NS]

但它不起作用。当我打字时,http://localhost/php/index.php我看到了这个页面,但我不想看到这个页面。我想看到http://localhost/php/index.php?categorie=apps&subcategorie=error404

有什么帮助吗?

答案1

我认为规则应该是:

RewriteRule !/php/index\.php\?categorie=apps&subcategorie=error404  /php/index.php?categorie=apps&subcategorie=error404  [L,NS]

模式[^...]表示除 之后列出的字符之外的任意单个字符^!表示否定整个模式。

答案2

RewriteRule指令仅与 URL 路径匹配,特别排除了查询字符串。在.htaccess(目录) 上下文中此 URL 路径也不以斜杠开头,因为目录前缀首先被删除。

检查“完整 URL”是否不是在 mod_rewrite 中,URL 路径 + 查询字符串的精确匹配并不那么简单。您需要使用RewriteCond指令来完成所有操作,或者使用两个 OR'd状况, 例如:

RewriteCond %{REQUEST_URI} !^/php/index\.php$ [OR]
RewriteCond %{QUERY_STRING} !^categorie=apps&subcategorie=error404$
RewriteRule ^ /php/index.php?categorie=apps&subcategorie=error404  [L,NS]

但是,如果您有其他指令重写 URL,则上述方法本身不一定能防止内部重写循环。

或者,您可以使用单个状况并对照THE_REQUEST服务器变量进行检查。这还可以防止任何潜在的重写循环,因为THE_REQUEST在重写 URL 时不会更新。例如:

RewriteCond %{THE_REQUEST} !^[A-Z]{3,9}\ /php/index\.php\?categorie=apps&subcategorie=error404\ HTTP/
RewriteRule ^ /php/index.php?categorie=apps&subcategorie=error404  [L,NS]

相关内容