htaccess url重写规则无法按预期工作

时间:2014-12-05 15:23:24

标签: php apache .htaccess url mod-rewrite

我有一个复杂的问题,我现在几天都无法解决。也许一些具有更多htaccess功能知识的专家将能够提供帮助。

我在根目录中放置了两个文件 - test.phpfiles_include.php

用户通常会看到的网址是:

www.example.com/test.php?cs1=A&cs2=B&cs3=C&cs4=D

由于这是一个丑陋的网址,我想将其重写为更好的内容:

www.example.com/search/A-B-C-D.html

使用像这样的.htaccess中的规则,我可以轻松地重写URL:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^search/([^-]*)-([^-]*)-([^-]*)-([^-]*)\.html$ /test.php?cs1=$1&cs2=$2&cs3=$3&cs4=$4 [L]

在test.php文件中,我调用了这样的网站配置文件:

include('files_include.php');

现在问题。一旦我将URL重写到与根目录不同的位置,我就会遇到一个非常奇怪的问题。该页面仍然在浏览器中呈现正确但是:

问题1。如果我想看图像正确,我必须用src="images替换src="../images。这可以通过提供绝对链接轻松纠正,这是更容易的部分。

但问题是为什么相对路径会发生变化?是.htaccess使浏览器认为我们在search'/文件夹中吗?这个问题的答案将帮助我确定主要问题,即问题2。

问题2。站点地图生成器在重写URL后无法关注页面上的链接,就好像它们显示为空白一样,无论在浏览器中看起来都很好。

因此,我猜测通过将URL重写为search/A-B-C-D.html,我打破了包含files_include.php的内容。

基本上,在重写root/test.phproot/search/A-B-C-D.html

时,我需要大致了解一下我应该考虑的事项。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您的浏览器对于“漂亮”而言毫无头绪。和丑陋的'网址。它只是请求一个文件夹或文件。如果您请求http://example.com/search/A-B-C-D.html,则在浏览器中请求A-B-C-D.html文件夹中的页面/search/。如果您在该页面上有任何相对URL,它将相对于该/search/文件夹请求它们。浏览器没有任何线索,也不应该知道请求的内部表示是什么样的。哎呀,在你的最后,它甚至可以翻译成仓鼠群体的指令,然后通过它发送正确的数据。浏览器不需要知道仓鼠的行为; - )

通过使您的网址绝对可以轻松解决第一个问题。我不建议相对于漂亮的网址制作它们。另一种解决方案是将<base>标记添加到您网页的<head>标记中。此标记的href属性将用作页面上任何相对链接的基础。有关详细信息,请参阅mdn。然后你会这样做:

<head>
  <base href="/">
</head>

至于你的第二个问题,包含本身不是问题。 include(..)将首先尝试在include_path中找到该文件,否则将在脚本的目录和工作目录中找到该文件。如果您创建漂亮的网址,这不会改变。 Apache和php仍然知道您正在执行的实际文件的位置。如果include语句无法加载文件,它也会生成错误,这是另一种可以判断包含本身是否存在问题的方法。请参阅the documentation

答案 1 :(得分:2)

  

但问题是为什么相对路径会发生变化?是.htaccess使浏览器认为我们在搜索&#39; /文件夹中?这个问题的答案将帮助我确定主要问题,即问题2。

它正在发生变化,因为浏览器正在加载/search/something-something-sometrhing-something.html而不是/test.php。第一个网址的相对URI基数为:/search/,第二个网址的基数为/

对于第二个问题,您可以尝试外部重定向,但不确定它是否有助于站点地图本身,它取决于生成器。尝试添加此规则:

RewriteCond %{THE_REQUEST} \ /+test\.php\?cs1=([^&]*)&cs2=([^&]*)&cs3=([^&]*)&cs4=([^&\ ]*)
RewriteRule ^ /search/%1-%2-%3-%4.html [L,R]