我的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来测试这个)
答案 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
时,会发生以下情况:
^(.+)(\.htm)?$
匹配“这是一个例子”^(.+)(\.htm)?$
匹配“index.php”为了防止第二次重定向(指定[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”。