【问题标题】:Apache mod_rewrite syntax not workingApache mod_rewrite 语法不起作用
【发布时间】:2012-09-06 20:23:52
【问题描述】:

好的,伙计们,我遇到了一个让我发疯的问题。事情是这样的:

我决定要重写我网站上的 URL。

它应该从这个语法重写:

http://www.sample.com/programming.php?name=something

到这里:

http://www.sample.com/tutorials/programming/something.php

或者(例如 2):

http://www.sample.com/other.php?name=test

到这里:

http://www.sample.com/tutorials/other/test.php

所以我的 URL 语法是:

http://www.sample.com/tutorials/(name 我的文件)/(变量名).php

我已经尝试了以下代码:

RewriteEngine On
RewriteRule ^tutorials/programming/(.+)$ /programming.php?name=$1 [L]
RewriteRule ^tutorials/other/(.+)$ /other.php?name=$1 [L]

但是,它没有正确地重写 URL。详细解释如下:

所以,当我访问我原来的网站时,它看起来像这样:

http://www.sample.com/programming.php?name=something

如果我访问此网址:

http://www.sample.com/tutorials/programming/something.php

我获得了我的网站 HTML,但没有我的 CSS 布局(仅显示 HTML)。此外,如果我单击非 CSS 网站上的任何其他链接,我会收到错误 404。请注意,index.php 网站的 URL 不是它应该是的:

http://www.something.com/index.php(正确的 index.php 网址)

但它是这样的:

http://www.sample.com/tutorials/programming/index.php(不存在)。

我已经在线阅读了 10 多个教程,请我的同事帮助我,但他的解决方案都没有奏效。所以,我想要完成的只是我的URL被重写了,所以当用户在编程中选择一个教程时,我在地址栏中没有得到这个URL:

http://www.sample.com/programming.php?name=something

但是这个:

http://www.sample.com/tutorials/programming/something.php

这就是我想要的。

我已尽量详细说明。如果您需要更多详细信息,请告诉我。

提前致谢!

【问题讨论】:

    标签: php apache url mod-rewrite


    【解决方案1】:

    我获得了我的网站 HTML,但没有我的 CSS 布局(仅显示 HTML)。此外,如果我单击非 CSS 网站上的任何其他链接,我会收到错误 404。请注意,index.php 网站的 URL 不是它应该是的:

    由于额外的斜线,您在页面内容中的相对/绝对路径得到了不同的基础。当你有<img src="images/blah.gif"> 之类的东西时,相对基数来自浏览器看到的 URL(不是服务器内部重写的内容)。因此,如果浏览器看到:http://www.sample.com/programming.php?name=something,则 URI 是 /programming.php,URI 基是 /。但如果浏览器看到http://www.sample.com/tutorials/programming/something.php,则URI 为/tutorials/programming/something.php,URI 基数变为/tutorials/programming/,我假设这不是您的images/css/scripts/etc 所在的位置(因为该目录可能没有甚至存在)。

    您需要通过添加以下内容来更正所有页眉中的 URI 基数:

    <base href="/">
    

    或将所有相对链接更改为绝对链接。

    【讨论】:

    • 我已经做到了,而且成功了!我现在可以使用以下 URL 访问我的完整网站 (CSS + HTML):sample.com/tutorials/programming/something.php。但是,当我访问我的网站时,我必须手动输入前面提到的 URL 以获取该类型的 URL(地址栏中未显示“新”URL)。我的地址栏中显示的 URL 仍然是(因此,我通常访问 sample.com/index.php,然后单击“学习编程”链接,然后单击任何教程):sample.com/programming.php?name=something。如何解决?
    • @TheGhost 这是一个完全不同的问题。您需要创建一组单独的规则来解决“野外链接”(例如,您无法控制的链接,例如来自 google 的链接)。您只需确保您的内部链接始终是友好的 URL。
    • 现在想问一下,我的 URL 现在是否已重写,尽管它没有显示在地址栏中?
    • @TheGhost 见我的answer to this question。重定向和重写是两件完全不同的事情。重写发生在服务器内部,客户端不知道任何类型的重写,重写严格是为了服务器处理请求和返回内容。重定向会影响浏览器,它们不是一回事。所以这个 rewrite 不会以任何方式影响浏览器,除了返回的内容。
    • @TheGhost 抱歉,之前的评论空间不足:但要回答您的问题,是的,它正在被重写。但是你的浏览器看起来好像什么都没发生,因为重写完全发生在服务器上,对客户端完全隐藏。
    【解决方案2】:

    我得到了我的网站 HTML,但没有我的 CSS 布局(仅显示 HTML)

    你是如何包含 css 的?您是否在其中包含您的文件

    ../../css/file.css

    或绝对模式

    /css/file.css?

    检查真正的问题是什么(我猜你的任务重写成功,例如我没有正确理解它)你能给我们真正的 uri 吗?

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多