【问题标题】:RewriteRule kindness重写规则善良
【发布时间】:2010-10-10 14:08:01
【问题描述】:

我正在尝试设置一些小的布局 - php 中的模板框架 - 除了一件事 - url 重写之外,一切都很顺利。

我不擅长正则表达式,更不擅长 mod_rewrite。我有点急于把这些东西拿出来,所以你能帮帮我吗?

我需要一个只有两条规则的 .htaccess 文件

  1. 以 .png/.jpg/.gif/.js/.css 结尾的每个请求都按原样处理。 (例如:http://mysite.com/img/image.png > http://mysite.com/img/image.png

  2. 其他的都用下面的方式重写:

    http://mysite.com/foo/bar/44 > http://mysite.com/public/index.php?1=foo&2=bar&3=44 http://mysite.com/ > http://mysite.com/public/index.php

非常感谢大家! 如果你愿意,我会把你的功劳放在东西上,然后我会把它作为开源的东西分享。

【问题讨论】:

    标签: regex mod-rewrite url-rewriting


    【解决方案1】:

    试试这些规则:

    RewriteRule .*\.(png|jpg|js|css)$ - [L]
    RewriteRule !^/public/index\.php$ /public/index.php [L]
    

    如果您想在 .htaccess 文件中使用这些规则,请从模式和替换中删除上下文路径前缀。

    请注意,第二条规则不会重写查询参数的请求,因为您无法使用 mod_rewrite 进行计数(或者至少会非常困难)。

    但您可以使用 PHP (name[]=value) 将其解释为数组的语法:

    RewriteRule ^/public/index\.php$ - [L]
    RewriteRule ^((/[^/]+)+)/([^/]+)$ $1?params[]=$3 [N,QSA]
    RewriteRule ^/([^/]+)$ /public/index.php?params[]=$1 [L,QSA]
    

    这允许任意数量的路径段。

    但我宁愿推荐我的第一个建议,并使用 PHP 进行路径解析:

    $_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    $segments = array_filter(explode('/', $_SERVER['REQUEST_URI_PATH']), 'strlen');
    

    【讨论】:

    • 我刚刚发布了我的防空洞解决方案,我看到了这个。我将发布我有些不完整的解决方案,并接受您的合法解决方案。
    • RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ public/index.php [QSA,L]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 2010-11-20
    • 2012-11-21
    • 2010-11-13
    • 2018-11-21
    相关资源
    最近更新 更多