将URL重写到同一目录

时间:2013-12-02 11:39:39

标签: php .htaccess mod-rewrite url-rewriting

我完全重写了我的网站代码,因为可以优化很多。我目前正在使用的重写规则也不是我想的优化。

我想要网址如下:

Cities:
domain.com/new-york
domain.com/chicago
domain.com/dallas
...

Categories:
domain.com/fruit
domain.com/meat
domain.com/beverage
...

目前,我的htaccess文件中包含此代码:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/\.]+) index.php?task=cityorcategory&cityorcat=$1 [L]

我在索引文件中的操作如下:

  1. 检查任务是否为“cityorcategory”
  2. 将“cityorcat”的值放在变量
  3. 将变量与类别数据库表进行比较
  4. 如果是类别,我会重定向到类别模板
  5. 否则,我会重定向到城市模板
  6. 我不想检查变量是否是索引文件中的类别,因为我认为这对网站性能不利。

    我不确定我需要在这里改变什么。我可以保留像index.php这样的URL结构吗?task = cityorcategory& cityorcat = $ 1或者这是一个坏主意吗?

    我需要更改哪些内容才能排除数据库中的变量比较?

2 个答案:

答案 0 :(得分:0)

如果是cityorcategory,你可以重写一个单独的页面,比如/city.php。

或者您可以将index.php视为分发中心,并在$ _GET上构建一个开关['任务']

switch ($_GET['task']) {

  case 'cityorcategory':
  // redirect
  break;

  case 'countrycategory':
  // redirect
  break;

  default:
    echo "Not a category, so process";
  break;
 }

如果您只是问:我如何知道数据库中是否存在类别..只需运行查询即可。我假设你必须根据类别构建页面。如果运行查询并返回0条记录,则该类别不存在,您可以显示默认索引页面。

或者,如果您没有很多类别,并且它们没有更改,您可以创建一个类别数组,并检查具有现有类别的数组。然而,这有点奇怪。但是,如果你死了再次类别..

在最后一种情况下:您可以再次针对现有类别进行HTACCESS匹配:如果这些是有限的数字和不要改变。

答案 1 :(得分:0)

您可以使用重写映射http://httpd.apache.org/docs/current/rewrite/rewritemap.html并让cronjob每x分钟构建一次映射。取决于数据更改的频率。