【问题标题】:How to prevent mod_rewrite from rewriting URLs more than once?如何防止 mod_rewrite 多次重写 URL?
【发布时间】:2011-11-30 15:49:58
【问题描述】:

我想使用 mod_rewrite 将一些人性化的 URL 重写到名为 php 的文件夹中的任意文件(它位于 web 根目录内,因为 mod_rewrite 显然不会让您重写到 web 根目录之外的文件) .

/        --> /php/home.php
/about   --> /php/about_page.php
/contact --> /php/contact.php

这是我的重写规则:

Options +FollowSymlinks
RewriteEngine On

RewriteRule ^$ php/home.php [L]
RewriteRule ^about$ php/about_page.php [L]
RewriteRule ^contact$ php/contact.php [L]

但是,我还想阻止用户直接访问此php 目录中的文件。如果用户输入以/php 开头的任何 URL,我希望他们获得404 页面。

我尝试在最后添加这个额外的规则:

RewriteRule ^php php/404.php [L]

...(其中 404.php 是一个输出 404 标头和“未找到”消息的文件。)

但是当我访问 //about 或 /contact 时,我总是被重定向到 404。似乎最终的 RewriteRule 甚至适用于内部重写的 URL(因为它们现在都以 @987654330 开头@)。

我认为[L] 标志(在前三个 RewriteRules 上)应该阻止应用进一步的规则?难道我做错了什么? (或者有没有更聪明的方法来做我想做的事情?)

【问题讨论】:

    标签: apache mod-rewrite


    【解决方案1】:

    [L] 标志只能在最后一条规则中使用,

    L - 最后一条规则 - 在此处停止重写过程,不再应用任何重写规则,因此您遇到了问题。

    【讨论】:

    • 但这正是我想要的,在这里结束重写过程。我是说我希望它在匹配后继续应用后续规则。但是最终的规则总是会被执行,即使之前的规则(带有 [L] 标志)已经被执行了。为什么?
    【解决方案2】:

    我有类似的问题。我有一个用 PHP 编写并基于模型-视图-控制范式的内容管理系统。最基础的部分是mod_rewrite。我已成功阻止全局访问 PHP 文件。该技巧的名称为THE_REQUEST

    有什么问题?

    重写模块重写 URI。如果 URI 与规则匹配,则将其重写,并将其他规则应用于新的重写 URI。但!如果匹配的规则以[L] 结尾,则引擎实际上并没有终止,而是重新启动。然后新的URI不再匹配以[L]结尾的规则,继续匹配最后一个。结果?程序员在意外的 404 错误页面上说脏话。不管电脑做什么,你说什么,不做什么,你想要什么。我的.htaccess 文件中有这个:

    RewriteEngine On
    RewriteBase /
    RewriteRule ^plugins/.* pluginLoader.php [L]
    
    RewriteCond %{REQUEST_URI} \.php$
    RewriteRule .* index.php [L]
    

    错了。甚至以plugins/ 开头的URI 也被重写为index.php

    解决方案

    当且仅当原始 - 未重写 - URI 与规则匹配时,您才需要应用规则。遗憾的是mod_rewrite 没有提供任何包含原始URI 的变量,但它提供了一些THE_REQUEST 变量,其中包含HTTP 请求头的第一行。这个变量是不变的。重写引擎工作时它不会改变。

    ...
    RewriteCond %{THE_REQUEST} \s.*\.php\s
    RewriteRule \.php$ index.php [L]
    

    正则表达式不同。它不仅仅应用于 URI,而是应用于标题的整个第一行,这意味着类似于GET /script.php HTTP/1.1。但是这一次只有当用户明确地直接请求一些 PHP 脚本时才应用关键规则。不使用重写的 URI。

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 1970-01-01
      • 2018-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多