删除查询字符串并重定向(重写规则并重写cond)

时间:2017-04-05 16:11:07

标签: php .htaccess mod-rewrite

我目前正在尝试设置重写规则,以便为更加搜索引擎优化的网址结构设置内部重定向。

我想表明:

/find-teacher/primary-school.php

而不是悲伤的样子:

/find-teacher/subject-class-choose.php?school=primary-school

在我阅读了一些有关重写规则和重写cond的帖子和教程之后,我想出了这个:

在我的choose-school.php中,我有一个漂亮的网址链接:

<a href="https://www.example.com/find-teacher/primary-school.php">
Primary School</a>

在我的.htaccess中:

RewriteCond %{REQUEST_URI} ^find-teacher/primary-school.php$
RewriteRule ^find-teacher/([a-z-]+)-([0-9]+).php$ /find-teacher/subject-class-choose.php?school=$1 [NC]

现在,如果我做对了,RewriteCond部分会检查是否请求了以下网址。如果是这种情况,那么([a-z-]+)-([0-9]+)的部分将替换为替换部分的$1/find-teacher/subject-class-choose.php?school=$1

问题是,如果点击/find-teacher/primary-school.php

,我会被重定向到我的错误页面

1 个答案:

答案 0 :(得分:1)

这里不需要RewriteCond和RewriteRule,因为它们(或者应该)都在检查相同的东西。

但是,目前没有匹配这两种模式的网址。让我们分解问题。

要专门检查网址/find-teacher/primary-school.php,您可以写一下:

RewriteRule ^find-teacher/primary-school.php$ /find-teacher/subject-class-choose.php?school=primary-school [NC]

下一步是使用()“捕获”“小学”,并使用$1将其动态放置到目标上:

RewriteRule ^find-teacher/(primary-school).php$ /find-teacher/subject-class-choose.php?school=$1 [NC]

最后,我们可以使用正则表达式[a-z-]+使模式匹配任何字母或连字符而不是精确的字符串:

RewriteRule ^find-teacher/([a-z-]+).php$ /find-teacher/subject-class-choose.php?school=$1 [NC]

在您的问题中的规则中,您已为正则表达式添加了一个额外部分:-([0-9]+)。这匹配-,然后匹配一个数字。要捕获该数字,您需要将$2放在目标中的某个位置:

RewriteRule ^find-teacher/([a-z-]+)-([0-9]+).php$ /find-teacher/subject-class-choose.php?school=$1&id=$2 [NC]

这会匹配/find-teacher/primary-school-123.php之类的内容,并将其转换为/find-teacher/subject-class-choose.php?school=primary-school&id=123

最后两个笔记:

  • 取决于您的Apache配置的设置方式可能会或可能不会需要在您的模式中包含前导/,即以{开头{ {1}}
  • 我发现一种调试重写规则的好方法是让它们重定向您的浏览器,方法是将^/添加到标记中(例如R=temp);这样,您就不必依赖PHP代码来告诉您请求的URL