mod_rewrite规则用于不同和可选参数

时间:2017-10-10 12:26:19

标签: apache .htaccess mod-rewrite

我正在用php写一个新闻程序,需要帮助为它编写mod_rewrite规则。虽然我对mod_rewrite和regex有一些了解,但并不多。我想做的是地图

#if all 5 params matches   
index.php?cat=uttarakhand&sub_cat=dehradun&genre=business&news_id=1&slug=my-news to /uttarakhand/dehradun/business/1/my-news
#if 3 prams match
index.php?cat=uttarakhand&sub_cat=dehradun&genre=business to /uttarakhand/dehradun/business
#if 2 prams match
index.php?cat=uttarakhand&sub_cat=dehradun to /uttarakhand/dehradun
#if 1 prams match
index.php?cat=uttarakhand to /uttarakhand

以上所有内容都可以实现,但我知道但问题在此之后开始,让我们说如果cat和genre是它应该是的参数

    #if cat and genre matches
    index.php?cat=uttarakhand&genre=business to /uttarakhand/business
    #if sub_cat and genre matches
    index.php?sub_cat=dehradun&genre=business to /dehradun/business
    #if only genre matches
    index.php?genre=business to /business
    #if only news matches
    index.php?news_id=1&slug=my-news to /1/my-news

我不知道它是否可能,但想法是如果某些参数丢失,甚至mod_rewrite应该重定向到匹配查询的php进行处理。 我一直在搜索stackoverflow这个已经有好几天但是我没有找到类似的问题,我的解决方案供我使用。

1 个答案:

答案 0 :(得分:0)

第一部分是可能的,但不是第二部分。

如果/foo/barfoocat,那么htaccess应该知道你是否sub_cut ...这是你在PHP逻辑中只能做的事情< / p>

所以我们只能这样做

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# rewite for /cat
RewriteRule ^([^/])/?$ /index.php?cat=%1 [L]

# rewite for /cat/sub_cat
RewriteRule ^([^/])/([^/])/?$ /index.php?cat=%1&sub_cat=%2 [L]

# rewite for /cat/sub_cat/genre
RewriteRule ^([^/])/([^/])/([^/])/?$ /index.php?cat=%1&sub_cat=%2&genre=%3 [L]

# rewite for /cat/sub_cat/genre/news_id/slug
RewriteRule ^([^/])/([^/])/([^/])/([^/])/([^/])/?$ /index.php?cat=%1&sub_cat=%2&genre=%3&news_id=%4&slug=%5 [L]

编辑:

如果您的网址中有额外的/,例如//sub_cat/genre这应该改写为/index.php?cat=&sub_cat=sub_cat&genre=genre。 <{1}}变量中会出现cat,但该变量为空。

Adendum:

我个人认为你根本不应该在htaccess中这样做。逻辑是复杂的,你应该在htaccess中构建它。我只需将完整的字符串重写为index.php文件:

$_GET

现在,您在一个变量中拥有完整的URL,从那里您可以构建逻辑。这是大多数CMS或PHP框架所做的,这是有充分理由的。