Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用mod_重写重定向问题(无扩展-站点根)_Php_Apache_Mod Rewrite - Fatal编程技术网

Php 使用mod_重写重定向问题(无扩展-站点根)

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 这将显示“这是一个示例” 但是,我要做的是

我在重写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

这将显示“这是一个示例”

但是,我要做的是让它也这样做,而不使用.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不是我写的。我只是在评论你之前问题中的一个拼写错误。