我在php中遇到一些重定向问题,我为此使用了.htaccess但没有成功我拥有的是以下 2 个网址:
http://localhost/PROJECT_NAME/USERNAME/348
http://localhost/PROJECT_NAME/USERNAME
我在这里想要的是:
1( 如果请求来自
http://localhost/PROJECT_NAME/USERNAME/111
然后它应该转到:
http://localhost/PROJECT_NAME/index.php
2( 如果请求来自
http://localhost/PROJECT_NAME/USERNAME
然后它应该转到:
http://localhost/PROJECT_NAME/detail.php
我试过什么:
RewriteRule /(w+)$ detail.php?id=$1 [L]
RewriteRule /(w+)$ index.php [L]
RewriteRule /$ detail.php?id=$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !index.php
RewriteCond %{REQUEST_URI} !(.*)/$
在此之后没有成功,它适用于索引,但不适用于详细信息页面,请帮助伙计们提前感谢您的时间
兰迪尔
你在这里有几个问题。 首先是匹配的顺序和特异性。
首先,正则表达式学习者的一个大问题:w
(速记"单词"字符类(相当于[A-Za-z0-9_]
。请注意包括的数字和下划线!
假设最后一个片段中的所有 ID都只是数字,并且用户名都是字母、数字和/或下划线的混合,您可以更改匹配顺序并首先使用d
(数字(字符类:
RewriteRule /(d+)$ index.php [L]
RewriteRule /(w+)$ detail.php?id=$1 [L]
这应该涵盖您的两个示例。
您没有概述第三条规则的用例,所以我不确定您将其应用于哪些 URL 或需要如何更改。 以下是一些观察结果:
- 您应该将
RewriteCond
行放在它们适用的RewriteRule
之前。(请记住,重写规则的表达式实际上是首先检查的,然后是条件。 - 现在,
RewriteRule
表达式将匹配以尾部斜杠结尾的任何内容,该斜杠不是实际文件。 - 另外检查它不是索引.php对
!-f
是多余的。 而且由于您与尾部斜杠匹配,因此您可能实际上想使用!-d
检查它是否不是目录(而不是文件( RewriteCond
表达式试图在否定表达式中捕获(因此它永远不会捕获任何内容,也不会匹配,因为有效表达式与规则中的表达式相同,/$
(
如果您尝试在上面的用户名上允许尾部斜杠,您可以添加到已有的内容中:
RewriteRule /(d+)$ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /(w+)/?$ detail.php?id=$1 [L]
如果您对第三条规则的用例有所不同,或者如果这些RewriteCond
表达式适用于您粘贴的规则下方的不同规则,请随时使用详细信息编辑问题,我也可以更新我的答案以解决这种情况。