2013-05-28 109 views
0

我有一个网站不使用友好的URL,我想改变这一点。到目前为止,我的链接如下所示:http://www.example.com/?l=EN&m=o36ASkkEVi,其中l变量包含查看语言,而m包含查看类别(菜单)。因为菜单项的ID是唯一的,所以即使它是子菜单项目,我也没有问题。但现在我正在尝试将其更改为友好URL,因此我有以下问题:.htaccess友好的URL防止重定向

首先,菜单项的友好标题不是唯一的,因为(至少在我的项目中)可能有多个子菜单项(类别)在不同的主菜单项中具有相同的标题。例如,菜单项CameraMobile Phone都有一个名为Instructions的子菜单。所以我的目标是最终的友好网址是http://www.example.com/EN/Mobile-Phone/Instructionshttp://www.example.com/EN/Camera/Instructions。其次,菜单的“深度”不是预定义的。所以可能有无限的子类别(菜单)。

在过去的小型网站中,我使用的是htaccess的静态重写(每个重定向都有一个规则),但现在,文章和类别都是不可数的,我不能这样做。我想在每篇文章或菜单的创建和编辑中重写.htaccess文件,以便为每种情况制定一个规则,但是我想在某个时候会产生一个巨大的.htaccess。该解决方案合法吗?

我的问题是这样的。如何在.htaccess中制定规则,以便始终将我发送到index.php,而不是在我编写http://www.example.com/EN/Camera/Instructions时尝试查找网站的子文件夹,但保持URL对“可见”PHP?

我知道后我可以使用explode('/', $_SERVER['REQUEST_URI']),并通过从数据库中选择正确的语言和文章或菜单来实现我的目标,但我没有或无法弄清楚如何完成第一部分。

另外,是否有任何方式.htaccess可以得到我所有的项目之后http://www.example.com/像一个数组,并将其作为变量传递给index.php

回答

1

与此代码在您的.htaccess,它发出的一切的index.php,其中$ 1的变量

RewriteRule ^(.*)$ index.php?path=$1 [L] 

这也很有趣:

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

只要找到一个文件夹或文件,它不会直接到index.php

+0

谢谢Petro! :)我已经尝试过了! –

0

我使用完全相同的系统为我的网站。这是我的.htaccess:

RewriteEngine on 
Options +FollowSymLinks 

# Redirect all valid requests to the engine or a valid file 
RewriteBase/
RewriteRule !data/|javascript/|templates/|\.(js|ico|gif|jpg|png|css|swf)$ index.php [NC] 

这里是我的web.config(IIS)

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <system.webServer> 
     <rewrite> 
      <rules> 
       <rule name="Rewrite rules"> 
        <match url="data/|javascript/|templates/|\.(js|ico|gif|jpg|png|css|swf)$" negate="true" /> 
        <action type="Rewrite" url="index.php" /> 
       </rule> 
      </rules> 
     </rewrite> 
    </system.webServer> 
</configuration> 

而且我从PHP读取路径是这样的,我撕开它从我的输入级结构,但你得到基本点子:

/** 
    * Parse the current url string. This overrides the parent::parse(); 
    * 
    */ 
    protected function parse($stripExtensions = "html,htm,xml") 
    { 
    $values = array(); 
    $regexp = '/(\.' . implode('|\.', $stripExtensions) . ')$/i'; 

    list($url) = explode('?', $_SERVER['REQUEST_URI']); 

    // Strip trailing slash and allowed extensions 
    if ($url{strlen($url)-1} == '/') { 
     $url = substr($url, 0, strlen($url)-1); 
     $this->extension = '/'; 
    } else { 
     $matches = array(); 
     preg_match($regexp, $url, $matches); 
     if (count($matches) > 1) $this->extension = $matches[1]; 
     $url = preg_replace($regexp, '', $url); 
    } 

    $variables = explode('/', $url); 
    array_shift($variables); // First one is always empty 
    $i = 0; 
    foreach($variables as $v) { 
     $values[$i++] = urldecode($v); 
    } 
    return $values; 
    } 
+0

非常有趣,谢谢! –