htaccess用于多个PHP文件

时间:2012-07-25 19:20:04

标签: php apache .htaccess

我被困住了正确设置我的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-新闻围绕即可。请告诉我.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

感谢您的帮助

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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会将相对网址重写为my/details.php?pid=an/example/page

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

  5. 现在,因为.htaccess中的第一个正则表达式如此广泛,它将匹配几乎没有 任何 请求的没有点的网址。这意味着第一条规则正在重写没有点的每个请求。请注意,即使像/an/example/page/(请注意尾部斜杠)也会被重写为my/details.php?pid=an/example/page/包括尾随斜杠),因为它匹配第一个正则表达式,然后Apache才会查看第二个(它似乎被设计为删除尾部斜杠 - 但它不会因为它永远不会有机会与URL匹配)。

    我希望这可以解决为什么你的.htaccess文件无法正常工作的原因。为了使其按需运行,您需要使用更具体的模式匹配,正如其他人展示的那样。但是,如果不知道你的所有网址是什么样的,以及你希望它们在哪里,那么没有人能够给你正确答案。