通过 php 中的 htaccess 重定向



我在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 或需要如何更改。 以下是一些观察结果:

  1. 您应该将RewriteCond行放在它们适用的RewriteRule之前。(请记住,重写规则的表达式实际上是首先检查的,然后是条件。
  2. 现在,RewriteRule表达式将匹配以尾部斜杠结尾的任何内容,该斜杠不是实际文件。
  3. 另外检查它不是索引.php对!-f是多余的。 而且由于您与尾部斜杠匹配,因此您可能实际上想使用!-d检查它是否不是目录(而不是文件(
  4. RewriteCond表达式试图在否定表达式中捕获(因此它永远不会捕获任何内容,也不会匹配,因为有效表达式与规则中的表达式相同,/$(

如果您尝试在上面的用户名上允许尾部斜杠,您可以添加到已有的内容中:

RewriteRule /(d+)$ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule /(w+)/?$ detail.php?id=$1 [L]

如果您对第三条规则的用例有所不同,或者如果这些RewriteCond表达式适用于您粘贴的规则下方的不同规则,请随时使用详细信息编辑问题,我也可以更新我的答案以解决这种情况。

最新更新