不止一个重写者

时间:2013-09-19 17:22:07

标签: php regex apache

我的想法是根据我所包含的 php 文件获取不同的变量,因此我在编程时避免过多的混淆。

<IfModule mod_rewrite.c>
    RewriteEngine On

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-l

    RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9+]+)$ index.php?p=$1&produccion=$2 [QSA,L]
    RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9+]+)$ index.php?p=$1&categoria=$2 [QSA,L]
    RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9+]+)/([a-zA-Z0-9+]+)$ index.php?p=$1&categoria=$2&show=$3 [QSA,L]
</IfModule>

事情是,当我这样离开时,它会覆盖之前的RewriteRule

我真的很喜欢这个正则表达式和apache的东西。

1 个答案:

答案 0 :(得分:1)

您可以考虑使用只使用一个RewriteRule:

RewriteRule ^(.+)$ index.php?p=$1 [QSA,L]

然后在PHP中解析$_GET['p']变量以确定适当的页面:

$page = (isset($_GET['p'])) ? explode('/', $_GET['p']) : null;
if ($page) {
    if ($page[0] == 'store') {
        if ($page[1] == 'cart') {
            // URL is www.example.com/store/cart
        }
        else if (!isset($page[1]) || empty($page[1])) {
            // URL is www.example.com/store
        }
    }
}
else {
    // URL is www.example.com
}

这不适合您网站的基础架构。如果您不希望所有内容都被重定向,您也可以考虑使用RewriteRules更具体。以此为例:

RewriteRule ^(about|faq|signup|contact)(?!\.php)/?(.*)$ /$1.php?page=$2 [QSA,L]

以上规则仅在用户访问example.com/about/faq/signup/contact时重定向,并且会被重定向到PHP文件同名。例如,对/faq/3的请求将重定向到/faq.php?page=3

相关问题