【问题标题】:htaccess url rewrite rule not working as expectedhtaccess url重写规则未按预期工作
【发布时间】:2015-02-03 19:36:40
【问题描述】:

我有一个复杂的问题,我好几天都无法解决。也许一些对 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]

在 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.php 重写为root/search/A-B-C-D.html 时,我需要一个大致的概念以及我应该记住的事情

有什么建议吗?

【问题讨论】:

  • 您可以排除某些目录,例如 /image 并且您的搜索 url 不需要 .html
  • 你是什么意思:“一旦 URL 被重写,站点地图生成器就不能跟随页面上的链接”?!如果您在 html 页面中使用链接作为search/a-b-c-d.html 站点地图生成器将使用它!我不明白你的第二个问题。
  • 您的站点地图生成器是做什么的?那么你的 files_include.php 中有什么?

标签: php apache .htaccess url mod-rewrite


【解决方案1】:

您的浏览器对“漂亮”和“丑陋”的网址一无所知。它只是请求一个文件夹或一个文件。如果您请求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 中查找文件,否则在脚本目录和工作目录中查找。如果您创建漂亮的 url,这不会改变。 Apache 和 php 仍然知道您正在执行的实际文件所在的位置。如果包含语句无法加载文件,它也会产生错误,这是您可以判断包含本身是否是问题的另一种方法。见the documentation

【讨论】:

    【解决方案2】:

    但问题是为什么相对路径会发生变化? .htaccess 是否让浏览器认为我们在 search'/ 文件夹中?这个问题的答案将帮助我确定主要问题,即问题 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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-11
      • 2019-03-15
      • 2020-01-12
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      相关资源
      最近更新 更多