htAccess URL 重写规则未按预期工作


htaccess url rewrite rule not working as expected

我有一个复杂的问题,我已经好几天都无法解决。也许一些对htaccess功能有更多了解的专家将能够提供帮助。

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

用户通常看到的 URL 是:

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

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

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]

在文件测试中.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.php时应该注意的事情root/search/A-B-C-D.html

有什么建议吗?

您的浏览器对"漂亮"和"丑陋"的网址一无所知。它只请求一个文件夹或文件。如果向浏览器请求http://example.com/search/A-B-C-D.html ,则正在请求/search/文件夹中的页面A-B-C-D.html。如果您在该页面上有任何相对 URL,它将相对于该/search/文件夹请求它们。浏览器不知道,也应该不知道请求的内部表示是什么样的。哎呀,在你的尽头,它甚至可能被翻译成仓鼠群的说明,然后它会发送正确的数据。浏览器不需要知道仓鼠的行为;-(

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

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

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

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

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

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

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