【问题标题】:Clean URLs with mod_rewrite and keep root path for includes (js and css)使用 mod_rewrite 清理 URL 并保留包含的根路径(js 和 css)
【发布时间】:2013-09-11 11:24:55
【问题描述】:

设置:我拥有一个运行 Apache 和 PHP 的常规 Unix Web 服务器。 它按预期提供 PHP 脚本。

现状:我所有的链接看起来都像典型的 PHP 链接,参数为website.net/index.php?show=article&do=new

我想要什么:一个用于重新映射我的 url 的 mod_rewrite 规则,无论它们看起来或包含如何。

例如: website.net/article/new 应该重定向到 index.php 和 $_SERVER['REQUEST_URI'] 应该包含 /article/new/ 等,但不限于此,没有固定模式(*n 变量),所有其他工作是用 PHP 完成的(验证,包括)。

到目前为止我的努力: 经常使用 google 并尝试了许多示例。但只发现了一些固定模式,有些甚至破坏了整个网站。

另一个问题:我在试验 mod_rewrite 时注意到它破坏了我的 js 和 css 文件的路径。 我使用相对路径,它们位于相对于 index.php 的子文件夹中

<script src="js/included_file.js"></script>

<link href="css/included_file.css" rel="stylesheet"">

【问题讨论】:

    标签: php apache mod-rewrite clean-urls


    【解决方案1】:

    您可以使用-f RewriteCondition 排除文件:

    RewriteCond %{REQUEST_FILENAME} !-f          #exclude files
    RewriteRule ^(.*) index.php?__path=$1 [QSA]  #catch everything
    

    如果您也想保留目录,您可以使用 -d 来做到这一点。

    现在如果你调用 URL:

    website.net/path/to/file?query=string&foo=bar
    

    你会得到(在你的$_GET):

    __path = "/path/to/file"
    query = "string"
    foo = "bar"
    

    不要使用$_REQUEST。它是非标准的,混合了$_GET$_POST,会导致非常奇怪的错误。

    【讨论】:

    • 对不起,$_REQUEST 应该是$_SERVER['REQUEST_URI']。目标是摆脱$_GET。将尽快尝试您的解决方案
    • 摆脱$_GET 没有意义,就像$_POST,你应该使用它。你可以做的一件事(我推荐它)是:在你的脚本开始时,从$_GET$_SERVER 挖掘你需要的所有输入,并且永远不要再使用这些全局变量。这只是很好的架构设计。
    • 摆脱,我的意思更像是“从用户的眼睛中隐藏它”。我完全可以从您的解决方案中使用和访问它们,例如$_GET["__path"]。在我的脚本开始时,我确实使用了一种机制来验证和清理输入并将它们存储在一个单独的数组中:)
    • 您可以选择不使用 QueryString。在这种情况下,您可以省略 [QSA] (QueryStringAppend) 标志。这意味着您将永远不会看到额外的 $_GET 参数,即使它们已被传递。
    • 测试了您的解决方案,它适用于第一个文件夹层次结构级别。 website.net/articles/ 工作正常,但 website.net/atricles/new 会因为缺少 css 和 js 文件而破坏设计。有没有办法用 mod_rewrite 解决这个问题,或者我应该使用文件的绝对 URL?我还用 -d 排除了目录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 2011-10-17
    • 2011-08-15
    相关资源
    最近更新 更多