我有一个复杂的问题,我已经好几天都无法解决。也许一些对htaccess功能有更多了解的专家将能够提供帮助。
我在根目录中放置了两个文件 - test.php
和 files_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]