4

我已成功创建重写规则来处理 URL,例如

http://example.com/xyz

http://example.com/xyz/

http://example.com/xyz/abc

http://example.com/xyz/abc/

这是 mod 重写和正则表达式:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^/?([0-9]+)(?:\/)?$ /index.php?p=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1 [L]
RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$2 [L]

这很好用,但问题是当我转到http://example.com/xyz/abc时,我的脚本得到了正确的输入(n=abc)但路径搞砸了,所以我的代码中的所有相对 URL被破坏了,因为它们现在是相对于 xyz 而不是根。

有没有办法解决这个问题?正如您在上面看到的,我试图重定向到 /index.php 以强制路径正确。经过一整天的正则表达式和代码,我的大脑被煎炸了,所以我希望这不是一件极其微不足道的事情。

4

5 回答 5

8

使用 HTMLbase元素强制所有相对 URL 使用与浏览器显示的路径不同的路径。

<base href="http://www.example.com/"/>
...
<a href="relative/url">link</a>

相对 URL 将使用“ http://www.example.com ”作为其基础,即使浏览器认为它正在查看页面“ http://www.example.com/xyz/ ”。所以链接转到“ http://www.example.com/relative/url ”而不是“ http://www.example.com/xyz/relative/url

还有 Stack Overflow 的做法,其中每个 URL 要么是绝对路径(指向图像等资源),要么是包含根的路径(即“/feeds/questions/123”),这避免了相对路径问题。

于 2009-11-18T13:11:19.307 回答
7

这三个选项是:

1) 使用基本标签(这将影响页面上的每个相关 URI,包括链接、图像、脚本、样式表等)

<base href="http://yoursite/">

2) 将所有链接更改为完全限定的 URI

<a href="http://yoursite/yourpage.html">

3) 使用“/”前缀表示路径是相对于每个 URI 上的根的。

<a href="/yourpage.html">

我个人最常使用 base-tag 选项,这确实得到了一些不好的报道(来自使用它但没有真正理解它的人)。对于 mod_rewrite,基本标签是完美的,因为您可能确实希望所有路径都相对于根,包括所有图像、css、脚本和链接。

于 2009-11-18T13:44:38.600 回答
2

编辑:我假设您正在讨论 HTML 代码中的 URL,例如图像和样式表,这些 URL 已损坏。

不,据我所知,没有办法绕过它,因为浏览器会看到一条路径,并请求相对于它的资源。它与服务器无关,您也无能为力。

您将不得不求助于不被解释为目录拆分器(例如下划线)的不同拆分器,或者使用绝对路径,或者使用<base> 标记。然而,我自己从来没有使用过基本标签,无论你看什么,它都不是很好。最好的办法可能是切换到绝对路径。

于 2009-11-18T13:10:00.283 回答
1

修改您的最后一个 RewriteRule 以包含路径。您在正则表达式中有路径。

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ $1/index.php?n=$2 [L]

或者(取决于您要达到的目标):

RewriteRule ^/?([-a-zA-Z0-9_+]+)/([-a-zA-Z0-9_+]+)(?:\/)?$ /index.php?n=$1/$2 [L]
于 2009-11-18T13:10:03.227 回答
1

我尝试在我的页面中使用 BASE 元素作为快捷方式,而不是更改所有 url。添加基本​​元素,如下所示:

<base href="/">

结果如下:

This:    <link type="text/css" rel="stylesheet" href="my.css">
Becomes: <link type="text/css" rel="stylesheet" href="/my.css">

This:    <script type="text/javascript" language="javascript" src="include/my.js"></script>
Becomes: <script type="text/javascript" language="javascript" src="/include/my.js"></script>

This:    <a href="foo.html">
Becomes: <a href="/foo.html">

This:    <a href="foo/bar.html">
Becomes: <a href="/foo/bar.html">

您始终可以在必要时覆盖基本标记:

This:    <a href="/foo">
Remains: <a href="/foo">

This:    <a href="/foo/bar/">
Remains: <a href="/foo/bar/">
于 2009-11-18T13:32:05.303 回答