【问题标题】:mod_rewrite RewriteRule and html linksmod_rewrite RewriteRule 和 html 链接
【发布时间】:2013-11-11 11:04:54
【问题描述】:

我正在创建一个新网站,其中包含一些 php。该网站基本上会像这样工作,我有/index.php?page=category_page。类别将是类别,页面将是子类别/实际页面的排序。重写后的规则如下所示:/category/page。

我有这个:

RewriteEngine On
RewriteRule ^category/([^/]*)$ index.php?page=$1 [L]

但我不知道如何将类别和页面分开,有什么帮助吗? 第二件事是,在我的 index.php 中(例如)我有一些来自外部文件的 css:

<link rel="stylesheet" type="text/css" href="style/style.css"/>

这不适用于重写规则,因为它会尝试加载不存在/不重写的 /category/page/style/style.css。我如何使它工作?我知道一个简单的修复方法是放置 /style/style.css 并且将从网站的根目录加载,但我目前正在从子目录运行网站,例如example.com/new/index.php 所以这不是一个选项。有什么帮助吗?

【问题讨论】:

  • 第二件事在你的路径中添加一个斜杠:/style/style.css

标签: php html apache .htaccess mod-rewrite


【解决方案1】:

问题一:

您可以在您的正则表达式中定义多个参数,例如类别和页面(见下文)。

不过,有了如此宽泛的重写规则,您可能希望为样式表、图像和其他资产添加一个不重写的条件。

我还修改了您的模式,使其仅匹配字母、数字、连字符和下划线,这将防止在您的类别或页面名称中使用非标准字符。

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(js|css|png|gif|jpg)$ [NC]
RewriteRule ^([\w\d\-]+)/([\w\d\-]+)/?$ index.php?category=$1&page=$2 [L]

问题 2:

您在 href 中使用了相对 url,它将样式表的位置附加到浏览器中定义的当前位置 (/category/page/)。

即使服务器端正在重写该 URL,浏览器也不知道重写。

如果您改用绝对 URL,您的浏览器将定义相对于 BASE url (/) 的 URL。

试试这个:

<link rel="stylesheet" type="text/css" href="/style/style.css"/>

【讨论】:

  • ([^/]*) 在这种情况下是否正确?斜线之前/之后不应该至少有一个字符吗? *0 or more
  • 请注意,并不是每个共享主机都支持字符组 \w 和 \d。因此,如果重写规则不起作用,请尝试使用本地组 [A-Za-z0-9]
  • 谢谢!这非常有效!另外,这是在我的个人服务器上,所以我没有这个问题 TiMESPLiNTER
【解决方案2】:

使用这个重写规则

RewriteEngine On
RewriteRule ^(.+)/(.+)/$ index.php?page=$1_$2 [L]

【讨论】:

    猜你喜欢
    • 2010-12-22
    • 2015-04-28
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多