Php 删除查询字符串并重定向(重写规则和重写条件)
我目前正在尝试设置一个重写规则,以设置一个内部重定向,从而获得一个更为SEO友好的url结构 我想展示: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://
/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]