Php htaccess如果不存在则忽略

Php htaccess如果不存在则忽略,php,regex,.htaccess,mod-rewrite,Php,Regex,.htaccess,Mod Rewrite,我试图使用htaccess使我的页面更容易阅读 我正在打开此URL: index.php?page=list&console=$1&letter=$2&sort=$3&dorder=$4&page_num=$5 [NC] 进入: 这是完整的代码: RewriteRule ^roms/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([0-9]+)/?$ /index.php?page=list&console=$1

我试图使用htaccess使我的页面更容易阅读

我正在打开此URL:

index.php?page=list&console=$1&letter=$2&sort=$3&dorder=$4&page_num=$5 [NC]
进入:

这是完整的代码:

RewriteRule ^roms/([^/\.]+)/([^/\.]+)/([^/\.]+)/([^/\.]+)/([0-9]+)/?$ /index.php?page=list&console=$1&letter=$2&sort=$3&dorder=$4&page_num=$5 [NC]
如果其中一个变量不存在,我怎么能使它如此呢?例如,如果sort=$3 dosent不包含任何内容,我怎么能阻止它转到404

因为如果我使用长URL并放置:

/index.php?page=list&console=ABCD&letter=T&sort=&dorder=asc&page_num=5
这很好用,尽管sort没有任何内容。但根据重写规则,只需要404个错误


谢谢

您的问题是正则表达式。每组的+表示匹配一次或多次。如果你在那里什么都没有,那么它根本无法匹配。因此,404。尝试将所有+s更改为*s

要使URL中的每个部分都是可选的,以下是适用于您的代码:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{QUERY_STRING} ^$ [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+roms/([^/\.]*)(?:/([^/\.]*)(?:/([^/\.]*)(?:/([^/\.]*)(?:/([^/]*))?)?)?)?/?[\s?] [NC]
RewriteRule ^ /index.php?page=list&console=%1&letter=%2&sort=%3&dorder=%4&page_num=%5 [L,QSA]

在这里使用_REQUEST变量很重要,否则多个//将分条为单个//

如果将[NC]重写为[L],会发生什么?您对所使用的指令缺乏基本的理解。我建议您进一步了解该功能,以便您可以根据需要使用它。这很可能会很好地满足您的需要--将NC更改为L仍然没有任何作用,我将查看您为我设置的链接。所有查询参数都可以是可选的吗?可以,在长url中,当它们不在那里时,它仍然可以正常工作,但是如果忽略了重写规则,我只会得到一个404错误。谢谢,这很好。我想我没有很好地解释它。但是你的正则表达式仍然没有达到你所期望的效果。@exon:即使有*它也不会起作用,你所期望的是,使每个部分都是可选的。是的,它仍然不是100%正确的,例如,这是可行的:index.php?page=list&console=nds&letter=all&sort=&dorder=desc&page_num=1即使$sort不包含任何数据,但是roms/nds/all//asc/5/不起作用,它不再给出404,而是表示空查询。有什么办法可以解决吗?太好了!非常感谢你!!
Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{QUERY_STRING} ^$ [NC]
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/+roms/([^/\.]*)(?:/([^/\.]*)(?:/([^/\.]*)(?:/([^/\.]*)(?:/([^/]*))?)?)?)?/?[\s?] [NC]
RewriteRule ^ /index.php?page=list&console=%1&letter=%2&sort=%3&dorder=%4&page_num=%5 [L,QSA]