0

我正在尝试使用 .htaccess 文件创建漂亮的 url,但遇到了一个奇怪的问题。

portfolio.php?id=2我想改成/portfolio/2/

似乎很简单的解决方案

RewriteRule ^portfolio/([0-9]+)/$ /portfolio.php?id=$1 [L]

这确实重定向到正确的脚本,但是当我尝试运行<?=$_GET['id'];?>它时它是未定义的。但是如果将脚本更改为不等于虚假目录的内容,它就可以工作。

RewriteRule ^portfolio/([0-9]+)/$ /portfolioitem.php?id=$1 [L]

并且只是为了确保它没有被我测试过的任何其他规则所捕获

RewriteRule ^portfolioitem/([0-9]+)/$ /portfolioitem.php?id=$1 [L]

又一次它未能拿起 id 参数!

有任何想法吗?!

干杯

4

1 回答 1

1

这听起来像是一个与Multiviews相关的问题加上一些PATH_INFO. 该Multiviews选项是 mod_negotiation 的一部分,它将尝试将请求的 URL 路径与文件路径匹配。它看到:

/portfolio/2/

并看到文件系统中有一个/portfolio.php文件,并假设这是您想要的(它是,但方式不同)。我愿意打赌,而不是看$_GET['id'],因为没有 GET 参数,这当然是空白的,如果你看$_SERVER['PATH_INFO'],你会看到它设置为/2/。这相当于去:

/portfolio.php/2/

/2/部分作为PATH_INFO. _ 而且由于 mod_negotiation 在处理管道中比 mod_rewrite 更靠前,因此您的重写规则永远不会被应用。

尝试关闭多视图。您可以使用Options指令在您的 htaccess 文件中执行此操作(假设您的主机已允许选项):

Options -Multiviews
于 2013-07-10T21:55:06.910 回答