你好,我有这个重写规则的例子,它做了以下例子:
[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件事
制作网址[http://localhost/project/index.php?url=tasks/view/&page=2]
显示为[http://localhost/project/tasks/view:2]
或[http://localhost/project/tasks/view#2]
然后我的上传文件夹命名(文件)我想重定向任何人得到任何
此文件夹中的文件只是浏览器
使用自定义网址下载名为(files)的上传文件夹中的文件,如[http:// localhost / project / getfile / 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。