Apache Mod_rewrite:两条规则具有相同的regexp,如果404引发,则第一条或第二条规则(又称最后一条规则)
我有simple.htaccess,它实现了前端控制器模式(即将非静态请求重定向到index.php) 按url为页面和新闻提供服务的规则Apache Mod_rewrite:两条规则具有相同的regexp,如果404引发,则第一条或第二条规则(又称最后一条规则),apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我有simple.htaccess,它实现了前端控制器模式(即将非静态请求重定向到index.php) 按url为页面和新闻提供服务的规则 RewriteRule ^([a-z0-9_]+)/$ /index.php?action=page&url=$1 RewriteRule ^([a-z0-9_]+)/$ /index.php?action=news&url=$1 如果没有传递url的页面(即404错误引发),我需要提供新闻 我想将2个规则分配给1个regexp:如果第一个
RewriteRule ^([a-z0-9_]+)/$ /index.php?action=page&url=$1
RewriteRule ^([a-z0-9_]+)/$ /index.php?action=news&url=$1
如果没有传递url的页面(即404错误引发),我需要提供新闻
我想将2个规则分配给1个regexp:如果第一个规则返回404,请尝试第二个。我知道其他方法:
.htaccess/mod_rewrite
实现这种行为吗
p.S.我决定不让事情过于复杂,而是实施变体1。只有在该位置没有现有文件或目录时,此重写才会生效
-f
标志将使重写仅在文件不存在时生效,而-d
标志将确保重写不会在目录存在时生效。您对两个规则使用相同的模式,这就是为什么第一个规则被处理,第二个规则被忽略的原因
更改这两个规则的模式
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]
现在,您可以将URL用作:
example.com/page/foo
example.com/news/foo
您想将所有404重定向到新闻页面吗?谢谢您的评论。不,这是一个非常简单的例子。我想为1个regexp分配2个规则:如果第一个规则返回404,请尝试第二个。谢谢您的回答。在问之前,我想把我的规则分成两部分。我还考虑将上述逻辑委托给实际的处理程序(在我的例子中是php)。但理想的行为是新闻和页面处于同一级别,即example.com/page-or-news-urlI决定不要使事情过于复杂,并实现您的变体。
example.com/page/foo
example.com/news/foo