【问题标题】:Apache Mod rewrite helpApache Mod 重写帮助
【发布时间】:2011-07-08 20:09:13
【问题描述】:

我已经研究了几个小时来解决这个问题,并想如果有人不介意帮助我,它可能会节省我一些时间。我的问题是关于 Apache mod_rewrite;当然,那里有大量的文档,但没有什么特定于我的要求:

以这种格式获取 URL:

language/pagename.php

(语言可以是“英语”或“法语”,我将为每种语言编写一个单独的规则。[尽管只需要一个示例]。页面名称可以是任何单词字符 (w+)。所有 URL 都将具有.php 扩展名)。

然后重写它,使用户浏览器中的 URL 不会改变,但这样 php 可以以这种格式接收它:

language/page.php?slug=pagename

例如所以$_GET['slug'] 将返回值pagename,然后所有请求都由page.php 处理。

到目前为止,我最好的猜测是

RewriteEngine On
RewriteBase /
RewriteRule ^english/(\w+).php$ english/page.php?slug=$1

但是这使得 php 告诉我 slug=page 这个 URL 例如 english/financial.php;而不是financial

也尝试了一堆其他的正则表达式约定 (.) 而不是 w 等等..

【问题讨论】:

    标签: mod-rewrite url-rewriting


    【解决方案1】:

    使用这些规则:

    RewriteEngine On
    RewriteBase /
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(english|french)/([^/\.]+)\.php$ /$1/page.php?slug=$2 [NC,QSA,L]
    
    1. 这需要放在根文件夹的 .htaccess 文件中。如果您将其放置在配置文件中(例如httpd-vhost.conf,在<VirtualHost> 指令内),则需要稍微更改规则。

    2. 只要您将它添加到规则中(english|french 部分),该规则就适用于任何语言。

    3. 此规则有一个条件,如果此类文件已存在,则不会重写。 这应该可以解决您与slug=page 的问题:在您的规则中,您很可能有一个重写循环(重写发生后它会进入下一次迭代——这就是 mod_rewrite 的工作原理,您需要有一些逻辑来打破这个循环)。您可以使用RewriteCond %{REQUEST_URI} !^/(english|french)/page\.php [NC] 而不是RewriteCond %{REQUEST_FILENAME} !-f,但维护起来有点困难(您需要在此处添加语言以及重写规则本身)。

    4. 如果您已经有其他一些重写规则,请注意将它们放置在正确的位置(规则的顺序很重要)。

    5. 1234563发送至\w+ 或任何您认为会更好的地方。
    6. 规则保留任何可选的页面参数(查询字符串)——对于保留引荐/跟踪代码等很有用。

    【讨论】:

    • 你个美女!在一条规则中涵盖两种语言文件夹的额外奖励积分.. 干杯。
    猜你喜欢
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多