我有一个不使用友好网址的网站,我想改变它。到目前为止,我的链接与此http://www.example.com/?l=EN&m=o36ASkkEVi
类似,其中l
变量包含查看语言,m
包含查看类别(菜单)。因为菜单项的id是唯一的,所以到目前为止我没有遇到任何问题,即使它是子菜单项。但现在我正在尝试将其更改为友好URL我有以下问题:
首先,菜单项的友好标题不是唯一的,因为(至少在我的项目中)在不同的主菜单项中可以有多个具有相同标题的子菜单项(类别)。例如,菜单项Camera
和Mobile Phone
都有一个名为Instructions
的子菜单。所以我的目标是最终的友好网址类似于http://www.example.com/EN/Mobile-Phone/Instructions
和http://www.example.com/EN/Camera/Instructions
。
其次,菜单的“深度”未预定义。因此,类别(菜单)可能存在无限的子类别。
过去对于小型网站我使用静态重写htaccess(每个重定向一个规则)但是现在,文章和类别不可数,我不能这样做。我想在每篇文章或菜单创建和编辑上重写.htaccess文件,以便为每个案例制定一个规则,但我想在经过一些观点之后会产生巨大的.htaccess。该解决方案是否合法?
我的问题是这样的。我怎么能在.htaccess上制定规则,总是把我发送到index.php
,而不是在我写http://www.example.com/EN/Camera/Instructions
时尝试查找网站的子文件夹但是保持URL对PHP是“可见的”? / p>
我知道之后我可以使用explode('/', $_SERVER['REQUEST_URI'])
并通过从数据库中选择正确的语言和文章或菜单来实现我的目标,但我不知道或无法找到如何做第一部分的方法
另外,.htaccess是否有任何方法可以将http://www.example.com/
之后的所有项目都添加到数组中并将其作为变量传递给index.php
?
答案 0 :(得分:1)
在.htaccess中使用此代码,它会将所有内容发送到index.php,其中$ 1是您的变量
RewriteRule ^(.*)$ index.php?path=$1 [L]
这也很有趣:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
每当找到文件夹或文件时,它都不会将其定向到index.php
答案 1 :(得分: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的路径,我从我的Input类结构中删除了它,但是你得到了基本的想法:
/**
* 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;
}