我有多个网址就像这样
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规则?
由于
答案 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]