1

我正在建立一个有很多参数的网站。目前我在我的 .htaccess 文件中使用这个代码:

Options +FollowSymLinks
RewriteEngine on
RewriteBase /epo

RewriteRule (.*)/(.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&param=$4&param2=$5 [QSA]
RewriteRule (.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&subsite=$4 [QSA]
RewriteRule (.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3 [QSA]
RewriteRule (.*)/(.*)/$ index.php?section=$1&content=$2 [QSA]
RewriteRule (.*)/$ index.php?section=$1 [QSA]

RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L]

我是 mod_rewrite 的新手,这就是为什么这段代码一团糟。有没有更好的方法来处理所有这些参数?最后两行只是在最后添加一个“/”以防万一。如果有人可以解释他们的代码也会很棒,所以我可以理解我做错了什么:)

4

2 回答 2

1

我个人将所有请求重定向到一个文件,然后从那里处理它。

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

然后在 index.php 中使用类似的东西

$params = explode('/', $_GET['path'];

$section = $params[0];
$content = $params[1];
$site    = $params[2];
$subsite = $params[3];
//etc.

请记住,您确实需要对所有参数进行一些额外的验证

于 2013-03-19T10:37:13.163 回答
1

它类似于 Hugo 的示例,但没有GET参数:

<IfModule mod_rewrite.c>
    SetEnv HTTP_MOD_REWRITE On
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} -s [OR]
    RewriteCond %{REQUEST_FILENAME} -l [OR]
    RewriteCond %{REQUEST_FILENAME} -d
    RewriteRule ^.*$ - [NC,L]
    RewriteRule ^.*$ index.php [NC,L]
</IfModule>

PHP您可以执行以下操作:

$pathInfo = pathinfo($_SERVER['SCRIPT_NAME']);
$baseUrl = $pathInfo['dirname'];
$baseFile = $pathInfo['basename'];
$url = rtrim(str_replace([$baseUrl, '/'.$baseFile], '', $_SERVER['REQUEST_URI']), '/');
$method = strtolower($_SERVER['REQUEST_METHOD']);
$isModRewrite = array_key_exists('HTTP_MOD_REWRITE', $_SERVER);

您的网址现在看起来像:

http://www.yourserver.com/param1/param2

或(如果未启用 mod 重写)

http://www.yourserver.com/index.php/param1/param2

在这两种方式中,$url变量看起来像/param1/param2

你可以explode在这个字符串上做,或者用这个字符串提供一个 PHP 路由库来提取你的参数。

PHP 路由示例库:

https://github.com/robap/php-router

https://github.com/deceze/Kunststube-Router

于 2013-03-19T10:54:52.663 回答