当没有满足其他规则以及如何在php中捕获该规则时,如何创建htaccess规则?

时间:2018-01-14 07:15:49

标签: php .htaccess

我有多个网址就像这样

http://www.example/discography/
http://www.example/discography/country/1/canada
http://www.example/discography/format/1/cd
http://www.example/discography/year/2010

我为每个人创建了htaccess规则

ErrorDocument 404 /notfound.php

RewriteRule ^discography/?$ music/music.php [L,QSA]

RewriteRule ^discography/country/(\d+)(?:/[^/]+)?/?$ music/music.php?country=$1 [L,QSA]

RewriteRule ^discography/format/(\d+)(?:/[^/]+)?/?$ music/music.php?format=$1 [L,QSA]

RewriteRule ^discography/year/([0-9]{4}+)/?$ music/music.php?year=$1 [L,QSA]

到目前为止,非常好。

在我的PHP脚本上,我正在捕捉像这样的值

if ( isset($_GET['country']) && is_numeric($_GET['country']) ) {
    echo 'country id';
    $get_countryid = (int)$_GET['country'];

} elseif ( isset($_GET['format']) && is_numeric($_GET['format']) ) {
    echo 'format id';
    $get_formatid = (int)$_GET['format'];

} elseif ( isset($_GET['year']) && is_numeric($_GET['year']) ) {
    echo 'year';
    $get_year = (int)$_GET['year'];

} else {
    // default value for url http://www.example.com/discography
    if ( empty($_GET) ) {
        echo 'http://www.example.com/discography';
    } else {
        echo 'None of the rules are met... show a msg';
    }
}

这是我遇到麻烦的地方......

如果用户输入了例如这样的错误网址

http://www.example/discography/@#$GRTGRWH$TG%G

即使网址无效,我也不想失去用户。我希望用户仍然看到该页面,以便他看到其他选项可以点击。

我尝试过这样的事情没有成功

RewriteRule ^discography/(.*)/?$ music/music.php [L]

如果没有满足其他规则以及如何在php中捕获该规则,如何创建htaccess规则?

由于

1 个答案:

答案 0 :(得分:1)

由于以下原因,您获得了意想不到的结果:

您的规则

 RewriteRule ^discography/?$ music/music.php [L,QSA]

RewriteRule ^discography/(.*)/?$ music/music.php [L]

两者都指向具有空/music/music.php变量的相同路径$_GET 因此,您的if ( empty($_GET) ) { echo 'http://www.example.com/discography' ;}语句正在针对两个网址运行。

您可以将(empty($_GET))替换为($_SERVER["REQUEST_URI"]=="/discography"))来解决此问题。这将检查当前的uri是否为/discography

或者您可以将GET参数添加到第二条规则的目标网址以解决此问题

 RewriteRule ^discography/(.*)/?$ music/music.php?foo=bar [L]