使用mod_rewrite重定向问题(没有扩展名 - 站点的根目录)

时间:2010-06-08 14:34:33

标签: php apache mod-rewrite

我的mod_rewrite有一个小问题

我的.htacces中有以下内容:

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.+)\.htm$ index.php?name=$1 [NC]

这是我的index.php文件:

<?php echo $_GET['name']; ?>

这适用于以下网址:

  

www.mySite.com/这是一个example.htm

这会显示“这是一个例子”

我正在尝试做的是让它做同样的事情,没有.htm扩展名: 例如:

  

www.mySite.com/这是一个例子

有什么想法吗?

(不要认为这是相关的,但我正在使用xampp来测试这个)

1 个答案:

答案 0 :(得分:1)

您可以在重写规则中将扩展名设为可选:

RewriteEngine on
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC]

请注意,这几乎相当于

RewriteRule ^(.+)$ index.php?name=$1 [NC]

这意味着除了直接访问www.mySite.com之外的任何URL都将重定向到index.php。如果你有更具体的规则,它们应该出现在这个规则之前。

更新:就像我说的那样,此规则基本上与www.mySite.com上的所有网址相匹配 - 包括index.php!因此,当您转到www.mySite.com/this is an example时,会发生以下情况:

  1. ^(.+)(\.htm)?$匹配“这是一个例子”
  2. mod_rewrite将其转换为/index.php?name=这是一个示例
  3. mod_rewrite重定向到/index.php?name=这是一个示例
  4. 重定向后,mod_rewrite再次尝试评估规则。
  5. ^(.+)(\.htm)?$匹配“index.php”
  6. mod_rewrite将其转换为/index.php?name=index.php,破解名称查询字符串参数的先前值
  7. 为了防止第二次重定向(指定[L]或者last,不起作用,因为在重新应用第一个重定向规则之后),您可以使用RewriteCond指定何时重定向:< / p>

    RewriteCond %{REQUEST_URI} !^index\.php
    RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC]
    

    如果请求URI(域后面的URL部分)以index.php开头,这告诉mod_rewrite 应用规则。

    您应该查看您可以指定的其他重写条件。例如,您可能不希望用户直接浏览到另一个php文件时被重定向,因此您也可以在RewriteCond中指定用户:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} !^index\.php
    RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC]
    

    其中显示“如果请求不是文件且请求不是index.php,则重定向到index.php”。