0

我被困在正确设置我的 htaccess 中。目前我有以下情况:

1). mydomain.com/my/details.php?pid=top-news-around

2). mydomain.com/my/toplinks/link.php?id=top-news-around

声明 .htaccess 与mydomain.com/details.php?pid=1111一起工作正常,但不适用于mydomain.com/toplinks/link.php?id=top-news-around。请让我知道.htaccess 有什么问题。

RewriteEngine On

RewriteRule ^([a-zA-Z0-9-/]+)$ my/details.php?pid=$1
RewriteRule ^([a-zA-Z0-9-/]+)/$ my/details.php?pid=$1

RewriteRule ^([a-zA-Z0-9-/]+)$ my/toplinks/link.php?id=$1
RewriteRule ^([a-zA-Z0-9-/]+)/$ my/toplinks/link.php?id=$1

感谢您的帮助

4

2 回答 2

1

再次,你的条件是一样的。更改它们以访问不同的文件。喜欢:

RewriteEngine On

RewriteRule ^details/([a-zA-Z0-9-/]+)$ my/details.php?pid=$1
RewriteRule ^details/([a-zA-Z0-9-/]+)/$ my/details.php?pid=$1

RewriteRule ^link/([a-zA-Z0-9-/]+)$ my/toplinks/link.php?id=$1
RewriteRule ^link/([a-zA-Z0-9-/]+)/$ my/toplinks/link.php?id=$1

mydomain.com/details/top-news-aroundmydomain.com/link/top-news-around

于 2012-07-25T19:25:59.167 回答
1

为了理解这个问题,我们来看看当请求到达服务器时 Apache 在做什么。

  1. 浏览器请求http://mydomain.com/an/example/page. 为此,它使用 HTTP 连接到 mydomain.com 上的服务器并发送GET /an/example/page请求(连同所有常见的 HTTP 请求标头)。 /an/example/page请求路径

  2. Web 服务器 (Apache) 现在必须决定使用哪个文件来处理请求。这里发生了很多事情,但最终它会读取.htaccess文件,从文档根目录中的文件开始。

  3. Apache 到达表示RewriteRule ^([a-zA-Z0-9-/]+)$ my/details.php?pid=$1并根据给定正则表达式检查请求路径的行。正则表达式将匹配完全由类中的一个或多个字符组成的任何字符串[a-zA-Z0-9-/]an/example/page匹配正则表达式,因此 Apache 将相对URL 重写为my/details.php?pid=an/example/page.

  4. 由于您尚未设置[L]标志,Apache 将继续尝试将URL 与其他规则进行匹配。新 URL 包含一个点,因此不匹配。my/details.php使用查询字符串调用该文件,pid=an/example/page并将运行该脚本的输出返回给浏览器。

现在,因为 .htaccess 中的第一个正则表达式非常宽泛,它几乎可以匹配任何没有点的请求 URL。这意味着您提出的每个不带点的请求都将被第一条规则重写。请注意,即使是/an/example/page/(注意尾部斜杠)之类的也会被重写为my/details.php?pid=an/example/page/包括尾部斜杠),因为它在 Apache 甚至查看第二个正则表达式之前匹配第一个正则表达式(它似乎已被设计为删除尾部斜杠 - 但它不会,因为它永远不会有机会与 URL 匹配)。

我希望这能解释为什么你的 .htaccess 文件没有像你期望的那样工作。为了让它按需要工作,您需要使用更具体的模式匹配,正如其他人所展示的示例。但是,如果不知道您所有的 URL 是什么样子以及您希望它们都去哪里,没有人能够给您正确的答案。

于 2012-07-25T19:58:50.553 回答