noob 的 mod 重写和相对 url 的问题

Posted

技术标签:

【中文标题】noob 的 mod 重写和相对 url 的问题【英文标题】:noob's problem with mod rewrite and relative urls 【发布时间】:2011-01-21 01:36:20 【问题描述】:

我一定是做错了什么,因为无论我如何尝试或谷歌搜索,我都找不到答案:(

所以,我想要一个像http://localhost/BLUEPRINT/list/857 这样的网址 像这样实际加载一个完美工作的网址:http://localhost/BLUEPRINT/list.php?lid=857

我可以在 .htaccess 文件中编写重写规则,并且可以读取 lid 变量。问题是 list.php 中的所有路径都是相对的。 Css、图像、javascript 等因此,当 SEO 友好的 url 加载时,所有这些项目都会在 BLUEPRINT/list/857/...

例如:<img src="images/logo.png" /> 在请求 seo 友好的 url 时实际上是这样的:<img src="list/857/images/logo.png" />

那我该怎么办?

我可能会尝试将页面中的所有路径转换为根相对路径(例如“/BLUEPRINT/images/logo.png”)而不是相对路径。但是页面中有几十个,即使我这样做,它们也不会在实际服务器上工作,因为它应该是“/images”而不是“/BLUEPRINT/images”。所以我不能只是将我的文件上传到实际的服务器。

我有哪些选择?所有这些精彩的脚本,如 wordpress、joomla 等,是如何做到的?处理这个问题?我到底做错了什么?它让我发疯!

【问题讨论】:

【参考方案1】:

您的新网址没有相同的基本路径前缀。这意味着相对 URL 路径的解析方式不同。引用 images/logo.png 现在解析为 /BLUEPRINT/list/images/logo.png 而不是 /BLUEPRINT/images/logo.png

要解决此问题,请在引用中使用绝对 URL 路径,例如:

<img src="/BLUEPRINT/images/logo.png" />

或者,如果您不想将基本 URL 路径 /BLUEPRINT/ 添加到所有引用元素,请将基本 URL 设置为 base

<base href="/BLUEPRINT/" />

现在相对 URL 路径是从此基本 URL 而非当前 URL 解析的。但请注意,更改基本 URL 会影响 所有 相对 URL。

【讨论】:

基本标签(不知道)对我来说似乎是一个很好的解决方案!我会尝试并让你知道。谢谢。 抱歉花了这么长时间尝试,但这正是我想要的!非常感谢! base 标签有问题。 blogs.msdn.com/b/ieinternals/archive/2009/07/27/… @DaveJarvis 相反:IE8 与BASE 存在一些问题。 @Gumbo:理论上这个bug已经修复了;在实践中,公众有很多错误的浏览器。【参考方案2】:

您可以编写一个条件,允许对 CSS、JS 和其他路径的请求通过并忽略您对 list.php 的重写规则。这是一个例子。

# Turn on URL rewriting
RewriteEngine On

# If your URL is www.example.com/, use /
RewriteBase /

# Find CSS and JS paths
RewriteCond $1 ^(BLUEPRINT/css|BLUEPRINT/js)

# No rewriting
RewriteRule ^(.*)$ - [PT,L]

这是一个来自 Apache 的很棒的教程,其中包含大量示例:http://httpd.apache.org/docs/2.2/misc/rewriteguide.html

祝你好运!

编辑: Apache 的另一个很好的链接是 mod_rewrite 文档。 http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html 对“passthrough”进行文本搜索。

要注意的 RewriteRule 的另一部分是破折号“-”。这意味着“不应执行替换”。

最后,我在示例中添加了 RewriteEngine 和 RewriteBase 规则。这应该使它更完整。

【讨论】:

【参考方案3】:

您是否尝试过应用“RewriteBase”-Rule?

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritebase

【讨论】:

我正在尝试RewriteBase /BLUEPRINT/RewriteBase /BLUEPRINT 似乎没有任何效果? 我知道我已经使用 RewriteBase 解决了类似的问题。我会尽力找出并回复你。

以上是关于noob 的 mod 重写和相对 url 的问题的主要内容,如果未能解决你的问题,请参考以下文章

htaccess mod 用斜杠将 $_GET 重写为变量

如何在 apache 上用 mod_rewrite 重写我的 url?

在Apache中使用mod_rewrite模块重写URL

使用 GET 变量对表单提交进行 Mod 重写

Apache URL重写规则

Mod重写根本不起作用(phtml/php)