如果expression式不匹配,我可以在重写规则中提供默认值吗?

我甚至不确定我是否正确地做这件事,所以我要在这里提出整个问题。

我有一个网站的url看起来像这样:

www.example.com/some-random-key/page.php 

我像这样redirect:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*?)/(.*?)$ $2?key=$1 

这大部分工作。 我的问题是以下两个url最终不等同:

 www.example.com/my-key www.example.com/my-key/ 

第二个示例的行为如预期,redirect到index.php的根级别,并传递“my-key”作为参数。

第一个示例失败,找不到错误。

有没有办法添加一个规则,说if the file isnt found, then fetch index.php?key=$key或者我是从一个错误的angular度来处理?

你的问题基本上是正则expression式。 你试图匹配任何后面跟着斜线的东西,然后是任何东西。

你应该试试:

 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/(.*)$ $2?key=$1 [R,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !^.*/$ RewriteRule ^(.*)$ ?key=$1 [R,L] 

第一块是你的configuration,并且就像你需要的一样工作。 第二个只适用于没有结尾的斜线,这是你想要的。

唯一的缺点是,如果有人要求一个URL后没有相应的page.php(假设/some-key/nonexistant.php),它将被redirect到?key = nonexistant.php(don'不知道怎么称呼这个,function或bug:P)。

请求/?key=your-key的默认页面是您的DefaultIndex