在.htaccess中动态解析URL

时间:2013-10-02 06:32:18

标签: php .htaccess

是否可以在.htaccess中进行奇数甚至替换,以使用/替换网址中的= &

换句话说,我有一个像这样的链接:

page/subscriber/action/manage/sortby/id

我想知道是否可以简单地将奇数编号/替换为=而将偶数/替换为&

我有一些很长的有很多参数的网址,我不想为每个网址写一个特定的规则。

我正在尝试将非常大的PHP脚本转换为格式良好的网址,并且需要数周才能找到所有可能的网址和参数组合。

2 个答案:

答案 0 :(得分:6)

为什么不想在PHP脚本中创建它?我想我在Zend框架中第一次看到了这个,但现在在我的项目中使用了类似的方法。

htaccess的:

RewriteEngine on
RewriteRule .* index.php

的index.php

$path = $_SERVER['REQUEST_URI'];
$paths = explode('/', $path);
// Add some logic for showing the page you need. Maybe remove domain before processing

例如,您可以将偶数参数用作数组键,并将参数添加为这些键的值。

e.g。要打印路径,请使用

echo "<pre>";
print_r ($paths);
echo "</pre>";

答案 1 :(得分:2)

您可以使用两个规则使用纯mod_rewrite执行此操作。此解决方案重复将规则应用于URL,直到没有任何内容重写它。此解决方案受到httpd.conf允许的内部重写循环数量的限制。我相信,默认情况下,这是10'递归'。这意味着您可以在获得 500内部错误之前重写最多10个键值对。如果您需要更多这些内容,请考虑在LimitInternalRecursion中增加httpd.confdocs)的值。请记住,您需要重新启动httpd服务才能使此更改生效。

如果您在网址中提供了偶数的“参数”(例如site.uri/a/b/c/d),则会将其重写为site.uri/somethingcustom.php?a=b&c=d。如果您在网址中提供了奇数个“参数”(例如site.uri/index.php/a/b/c/d),则会将其重写为site.uri/index.php?a=b&c=d。在奇数个参数的情况下,您可以使用另一个规则将剩余的“事物”(在我的示例中为index.php)重写为实际路径(例如site.uri/categories/a/bsite.uri/path/to/categories.php?a=bcategories重写为path/to/categories)。这样的规则必须遵循以下两条规则。

解决方案使用QSA标志(查询字符串追加)。这会将提供的查询字符串附加到上一个查询字符串(在这种情况下非常有用)。请参阅the docs

RewriteRule ^(.*)/([^/]+)/([^/]+)/?$ /$1?$2=$3 [QSA]

RewriteCond %{REQUEST_URI} !^/path/to/somethingcustom\.php$
RewriteRule ^([^/]*)/([^/]*)$ /path/to/somethingcustom.php?$1=$2 [QSA]

有关mod_rewrite的一般信息,请参阅the mod_rewrite docs


请注意,此方法要求Apache多次执行.htaccess。如果将规则放在.htaccess文件的顶部并使用L标志,则解决方案将更有效。