我正在用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这个已经有好几天但是我没有找到类似的问题,我的解决方案供我使用。
答案 0 :(得分:0)
第一部分是可能的,但不是第二部分。
如果/foo/bar
是foo
或cat
,那么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
,但该变量为空。
我个人认为你根本不应该在htaccess中这样做。逻辑是复杂的,你应该在htaccess中构建它。我只需将完整的字符串重写为index.php文件:
$_GET
现在,您在一个变量中拥有完整的URL,从那里您可以构建逻辑。这是大多数CMS或PHP框架所做的,这是有充分理由的。