Mod_rewrite:具有相同正则表达式的两个规则,如果404引发则为第一个或第二个(也就是最后的规则)

时间:2015-12-02 05:35:45

标签: apache .htaccess mod-rewrite

我有简单的.htaccess,它实现了前端控制器模式(即将非静态请求重定向到index.php)

按网址投放网页和新闻的规则。

RewriteRule ^([a-z0-9_]+)/$ /index.php?action=page&url=$1
RewriteRule ^([a-z0-9_]+)/$ /index.php?action=news&url=$1

如果没有传递网址的网页(即404错误加注),我需要发布新闻。

我想为1个正则表达式分配2个规则:如果第一个规则返回404,请尝试第二个。我知道其他方法:

  1. 使用两个具有不同正则表达式的规则,如@Starkeen所述。
  2. Deligate登录到实际的处理程序(在我的例子中是php)。
  3. 我可以使用.htaccess/mod_rewrite实现此行为吗?

    P.S。我决定不要过度复杂化并实施变体1。

2 个答案:

答案 0 :(得分:1)

您对两个规则使用相同的模式,这就是为什么第一个被处理而第二个被忽略的原因。

更改两个规则的模式

RewriteRule ^page/([a-z0-9_]+)/?$ /index.php?action=page&url=$1 [NC,L]
RewriteRule ^news/([a-z0-9_]+)/?$ /index.php?action=news&url=$1 [NC,L]

现在您可以将您的网址用作:

example.com/page/foo
example.com/news/foo

答案 1 :(得分:0)

只有在该位置没有现有文件或目录时才会启动此重写。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php?action=news&url=$1 [L,QSA]

的 如果文件不存在,-f标志将仅重写,-d标志将确保重写不会在目录存在的情况下启动。< / p>