【问题标题】:Strange error with mod rewritemod重写的奇怪错误
【发布时间】:2014-07-18 09:19:01
【问题描述】:

我的 mod_rewrite 有一个奇怪的错误。

这是我的 htaccess:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?a=$1 
RewriteRule ^(.*)/(.*)$ index.php?a=$1&b=$2
RewriteRule ^(.*)/(.*)/(.*)$ index.php?a=$1&b=$2&c=$3

当我输入地址栏时:

localhost/test/1/2

在我的 index.php 文件中,我有:

echo '<pre>';
print_r($_GET);
echo '</pre>';

我应该期待看到的是:

Array
(
    [a] => test
    [b] => 1
    [c] => 2
)

但我得到的结果是:

Array
(
    [a] => index.php
    [b] => 1
    [c] => 2
)

我做错了什么?

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite


    【解决方案1】:

    If-Then-Else 逻辑,互斥(和最终)规则

    有几个问题。

    • In mod-rewrite,一组条件仅适用于一个规则。但在这里,您尝试将它们应用于多个规则。
    • 您的规则不是相互排斥的。 .* 匹配所有字符,因此它可以匹配所有三种模式。我们需要更具体的规则。
    • 您的规则不是最终规则(需要L 标志)。

    试试这个:

    RewriteEngine On
    
    # IF: Does the file or folder exist?
    RewriteCond %{REQUEST_FILENAME} -f
    RewriteCond %{REQUEST_FILENAME} -d
    
    # THEN leave unchanged, skip 3 rules
    RewriteRule ^ - [L,S=3]
    
    # ELSE (the file or folder does not exist)
    RewriteRule ^([^/]+)/?$ index.php?a=$1 [L]
    RewriteRule ^([^/]+)/([^/]+)/?$ index.php?a=$1&b=$2 [L]
    RewriteRule ^([^/]+)/([^/]+)/([^/]+)$ index.php?a=$1&b=$2&c=$3 [L]
    
    # FINALLY: leave unchanged
    RewriteRule ^ - [L]
    

    【讨论】:

    • 它只返回:Array ( [a] => index.php )
    • 所以答案有帮助,还是您做了其他事情?如果解决了,请单击左侧的复选标记以接受答案。谢谢。 :)
    • 太棒了,很高兴听到它有帮助!根据SO礼仪的铁律,我也可以tell someone who has never upvoted an answer about how it works。 :) 如果这个或另一个答案有帮助,您会考虑单击答案左侧复选标记上方的向上箭头来推广它吗?这就是声誉系统在这里的运作方式。谢谢!
    • @anubhava 谢谢你,仅供参考,我正在跳舞,这是我第一次接受SKIP 的答案。我一直想让 IF-THEN-ELSE 逻辑工作一段时间,但正如您所知,总会有其他问题阻止解决方案工作。 :) 我觉得 FINALLY 行是不需要的,但我不希望跳到不存在的规则有崩溃的风险。
    • 嘿Yooouuri,如果你有时间,你能试试没有最后两行的解决方案吗(从# FINALLY:到最后)?我把它放进去是为了安全,因为mod-rewrite 文档没有指定是否允许跳到没有更多规则的地方,但我觉得它会起作用。如果你尝试,请告诉我结果。谢谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多