Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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 删除查询字符串并重定向(重写规则和重写条件)_Php_.htaccess_Mod Rewrite - Fatal编程技术网

Php 删除查询字符串并重定向(重写规则和重写条件)

Php 删除查询字符串并重定向(重写规则和重写条件),php,.htaccess,mod-rewrite,Php,.htaccess,Mod Rewrite,我目前正在尝试设置一个重写规则,以设置一个内部重定向,从而获得一个更为SEO友好的url结构 我想展示: /find-teacher/primary-school.php 而不是悲伤的表情: /find-teacher/subject-class-choose.php?school=primary-school 在阅读了一些关于重写规则和重写条件的帖子和教程后,我想到了以下几点: 在我的choose-school.php中,我有一个漂亮的url链接: <a href="https://

我目前正在尝试设置一个重写规则,以设置一个内部重定向,从而获得一个更为SEO友好的url结构

我想展示:

/find-teacher/primary-school.php
而不是悲伤的表情:

/find-teacher/subject-class-choose.php?school=primary-school
在阅读了一些关于重写规则和重写条件的帖子和教程后,我想到了以下几点:

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

<a href="https://www.example.com/find-teacher/primary-school.php">
Primary School</a>
现在,如果我答对了,重写cond部分将检查是否请求了以下url。如果是这种情况,则替换部分(
/find teacher/subject class choose.php?school=$1
)的
([a-z-]+)-([0-9]+)
部分被替换为
$1


问题是,如果我单击
/find teacher/primary school.php

这里不需要重写条件和重写规则,因为它们(或应该)都在检查同一件事

但是,目前没有匹配这两种模式的URL。让我们把问题分解一下

要专门检查URL
/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]
最后,我们可以使用regex
[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配置的设置方式,您可能需要也可能不需要在模式中包含前导的
    /
    ,即从
    ^/
    开始
  • 我发现调试重写规则的一个好方法是让它们重定向浏览器,方法是将
    R=temp
    添加到标志(例如
    [NC,R=temp]
    );这样,您就不必依赖PHP代码来告诉您请求了什么URL

查询字符串
school\u id=1
表示小学数据吗?@AbhishekGurjar对不起,我把它改为
school\u id=primary
非常感谢!我的页面
/find teacher/primary.php
现在重定向到
/find teacher/subject class choose.php?school=primary school
。但问题是,我认为这是一个“内部”重定向,对于访问者和SEO友好型用户来说是不可见的-如果我从链接重定向到外观不好的url,它仍然显示为url地址栏中的目标url。我一直在查看更多的教程,但所有的教程都表示这将是“不可见的”和“内部的”,尽管它不在我这边:(.我做错了什么?@Franky2207带有
[R]
标志,浏览器被告知转到新的URL;没有它,Apache只是“假装”您位于新的URL上,没有告诉浏览器。您可能还需要添加
[L]
(用于“Last”)标志,以阻止配置下的其他规则导致额外重定向。请注意,如果您使用
[R]
而不使用
=temp
,它将发出“永久性”命令重定向,您的浏览器可能会缓存该重定向,或多或少永远;请使用稍微不同的URL进行测试,以确保这不是问题所在。再次感谢。这是否意味着我必须使用
[R]
标志,否则重定向无法正常工作?我想我真的不明白告诉浏览器和假装浏览器之间的区别。如果我忽略
[R]
标志,它应该显示
/primary school.php
。它还通过
$\u GET
学校id
传输值。是否仍然不建议省略
[R]
标志?我还使用了不同的URL并使用
[L]
标志尝试了它,但它仍然会导致一个“悲伤的URL”在地址栏中,如果我包括
[R=temp]
。在你的情况下,省略
[R]
标志是正确的。这不是关于推荐与否,而是关于不同的用例。如果你想说“你键入了一个旧的或错误的URL,请转到这里”,你会想告诉浏览器,所以会使用
[R]
;在您的情况下,您想说“这是一个很好的URL,我知道您的意思”,因此不会使用
[R]
。我可能会将您与我的注释混淆,即有时使用
[R=temp]
对于测试非常有用,因为当它显示在地址栏中时,您可以更容易地看到测试结果;一旦完成测试,您就可以将标志拿走。非常感谢您的帮助。我现在就知道了:)非常感谢您的帮助!
RewriteRule ^find-teacher/([a-z-]+)-([0-9]+).php$ /find-teacher/subject-class-choose.php?school=$1&id=$2 [NC]