Php 使用mod_重写重定向问题(无扩展-站点根)
我在重写mod_时遇到了一个小问题 我的.htacces中有以下内容:Php 使用mod_重写重定向问题(无扩展-站点根),php,apache,mod-rewrite,Php,Apache,Mod Rewrite,我在重写mod_时遇到了一个小问题 我的.htacces中有以下内容: Options +FollowSymlinks RewriteEngine on RewriteRule ^(.+)\.htm$ index.php?name=$1 [NC] 这是我的index.php文件: <?php echo $_GET['name']; ?> 这对于以下url非常有用: www.mySite.com/this is example.htm 这将显示“这是一个示例” 但是,我要做的是
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^(.+)\.htm$ index.php?name=$1 [NC]
这是我的index.php文件:
<?php echo $_GET['name']; ?>
这对于以下url非常有用:
www.mySite.com/this is example.htm
这将显示“这是一个示例”
但是,我要做的是让它也这样做,而不使用.htm扩展名:
例如:
www.mySite.com/这就是一个例子
有什么想法吗
(我不认为这有什么关系,但我正在使用xampp来测试)您可以在重写规则中选择扩展:
RewriteEngine on
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC]
注意,这几乎相当于
RewriteRule ^(.+)$ index.php?name=$1 [NC]
这意味着除了直接访问www.mySite.com之外的任何URL都将重定向到index.php。如果您有更具体的规则,它们应该出现在此规则之前
更新:就像我刚才说的,这个规则基本上会匹配www.mySite.com上的所有URL——包括index.php!因此,当您访问www.mySite.com/这是一个示例时,会发生以下情况:
^(+.+)(\.htm)$
匹配“这是一个示例”
mod_rewrite将其转换为/index.php?name=这是一个示例
mod_rewrite重定向到/index.php?name=这是一个示例
重定向后,mod_rewrite再次尝试计算规则
^(+.+)(\.htm)$
匹配“index.php”
mod_rewrite将其转换为/index.php?name=index.php,删除name querystring参数的前一个值
为了防止第二次重定向(指定[L]或最后一次不起作用,因为在重新应用第一次重定向规则后),可以使用指定何时重定向:
RewriteCond %{REQUEST_URI} !^index\.php
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC]
这告诉mod_rewrite tonot如果请求URI(域后URL的一部分)以index.php开头,则应用该规则
您应该查看可以指定的其他重写条件。例如,如果用户直接浏览到另一个php文件,您可能也不希望用户被重定向,因此您也可以在RewriteCond
中指定:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^index\.php
RewriteRule ^(.+)(\.htm)?$ index.php?name=$1 [NC]
其中的内容是“如果请求不是文件,并且请求不是index.php,请重定向到index.php”。感谢您的快速响应。但是,当我尝试这样做时,页面上的输出是“index.php”,而不是“this is an example”,仍然不起作用-这种情况确实会重写规则^([^/\.]+)/?$index.php?name=$1[L]-但是,如果我放“www.whater.com/this is a test.htm”它爆炸了…?要么你在index.php代码中引入了一个类型,要么你在$\u GET['name]
中的name
后面缺少了一个引号……这就是我的index.phpOh中的全部内容,-1不是我写的。我只是在评论你之前问题中的一个拼写错误。