mod_rewrite用于将SEO友好链接直接动态映射到单个文件,无需通过前端控制器进行路由

时间:2010-11-15 17:55:33

标签: php regex apache .htaccess mod-rewrite

我正在寻找一个SEO友好的网址重写规则,适用于任何没有前端控制器的常见PHP网站。它会将SEO友好URL直接映射到服务器上存在的PHP文件,并将剩余的URL分支转换为标准URL参数。

例如:

/ folder1中/文件夹2 / folder3 /页/ VAR1 / VAL1 / VAR2 / val2次/ VAR3 / VAL3

将映射到:

/folder1/folder2/folder3/page.php?var1=val1&var2=val2&var3=val3

现在,这是棘手的部分。由于重写规则需要与文件夹,页面和变量的所有名称完全无关,因此需要将URL参数的重写基于链接上的确切位置,其中可以找到沿路径存在的文件。例如,考虑以下文件是否恰好存在(假设)文档根目录: /folder1/folder2.php
在这种情况下,以下重新映射将是合法且可接受的:
/folder1/folder2.php?folder3=page&var1=val1&var2=val2&var3=val3

这将是许多传统网站的最终重写规则,这些网站已经构建,希望他们的网址和参数能够立即变得对网址友好。

我发现的唯一示例涉及将所有内容映射到单个前端控制器或规则中预期存在的硬编码文件,而不是让mod_rewrite动态检测它们的存在。它们是相关的,但对于任何存在的文件都不灵活:

1 个答案:

答案 0 :(得分:1)

Apache Web服务器已经知道这样一个概念:

  • MultiViews

      

    MultiViews的效果如下:如果服务器收到/some/dir/foo请求,/some/dir启用了MultiViews/some/dir/foo没有存在,然后服务器读取目录查找名为foo。*的文件,并有效地伪造一个类型映射,该映射命名所有这些文件,为它们分配相同的媒体类型和内容编码,如果客户端要求其中一个他们的名字。然后,它会根据客户的要求选择最佳匹配。

  • Path Info

      

    此指令控制是否接受或拒绝包含跟随实际文件名(或现有目录中不存在的文件)的尾随路径名信息的请求。尾随路径名信息可供PATH_INFO环境变量中的脚本使用。

         

    例如,假设位置/test/指向仅包含单个文件here.html的目录。然后,/test/here.html/more/test/nothere.html/more的请求都将/more收集为PATH_INFO

然后你需要调整的是获取路径信息部分并解析它。

除此之外,如果你真的想用mod_rewrite实现这种行为,试试这个:

RewriteCond %{DOCUMENT_ROOT}/$0.php !-f
RewriteRule ^(.+)/([^/]+)/([^/]+)$ /$1?$2=$3 [N,QSA]
RewriteCond %{DOCUMENT_ROOT}/$0.php -f
RewriteRule .+ /$0.php [L]