如何向RewriteEngine添加许多规则

时间:2014-02-21 18:48:19

标签: php apache .htaccess mod-rewrite

你好,我有这个重写规则的例子,它做了以下例子:

[http://localhost/project/index.php?url=something]

在我的网站上我用它来制作

[http://localhost/project/index.php?url=task/add]

显示为

[http://localhost/project/task/add]

这是我的代码

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

我需要做其他3件事

  1. 制作网址[http://localhost/project/index.php?url=tasks/view/&page=2]

    显示为[http://localhost/project/tasks/view:2]

    [http://localhost/project/tasks/view#2]

  2. 然后我的上传文件夹命名(文件)我想重定向任何人得到任何

    此文件夹中的文件只是浏览器

  3. 使用自定义网址下载名为(files)的上传文件夹中的文件,如[http:// localhost / project / getfile / 1]

1 个答案:

答案 0 :(得分:1)

首先,我想提醒您#是网址的“锚点”部分。它永远不会发送到服务器,因此重写它可能不是最好的主意。

您现有规则的作用是在内部将所有未映射到现有文件,目录或符号链接的请求重写为index.php。如果您想重写http://localhost/project/tasks/view:2等要重写为http://localhost/project/index.php?url=tasks/view&page=2的网址,则需要在您已有的规则之前添加此规则。否则,更一般的规则会在更具体的规则之前匹配它。

我还假设您的.htaccess目录中有/project/


  

制作网址[http://localhost/project/index.php?url=tasks/view/&page=2]

     

显示为[http://localhost/project/tasks/view:2]

     

[http://localhost/project/tasks/view#2]

在现有规则之前添加以下规则应该很好地处理这些网址。

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-l
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^tasks/view:(.+)$ index.php?url=tasks/view&page=$1 [QSA,L]

或者,您为什么不在explode( $_GET['url'], ':' );index.php而不是此规则。


  

然后我的上传文件夹命名(文件)我想重定向任何人得到任何

     

此文件夹中的文件只是浏览器

如果您要停止对/project/files的所有直接请求,您可以使用%{THE_REQUEST}技巧和[F](禁止)标记。如果要显示自定义错误页面,请为禁止状态代码添加errordocument handler

RewriteCond %{THE_REQUEST} ^(GET|POST)\ /project/files
RewriteRule ^ - [F,L]

  

使用自定义网址下载名为(文件)的上传文件夹中的文件   [HTTP://本地主机/项目/ GETFILE / 1]

请记住,对于您发送到服务器的每个请求,Apache都会将它与RewriteRule中的正则表达式进行匹配,并在内部重写或重定向用户。要将请求内部重写为/project/getfile/1/project/files/1,您可以使用以下规则。 之前添加 你已经拥有的规则。

RewriteRule ^getfile/(.*)$ /files/$1 [L]

我建议你阅读the documentation了解mod_rewrite。