我很糟糕,mod_rewrite
但是我需要重写对文件夹的任何请求/files/users/*/
(* 是通配符)/view/
并将文件名插入到查询参数中,如下所示:
/files/users/9/test.pdf
变成/view/?file=test.pdf
假设.htaccess
文件将位于内部,我将如何处理/files/users/
?
如果您在我慢慢尝试熟悉的过程中解释您的解决方案如何工作,我将不胜感激mod_rewrite
。
我很糟糕,mod_rewrite
但是我需要重写对文件夹的任何请求/files/users/*/
(* 是通配符)/view/
并将文件名插入到查询参数中,如下所示:
/files/users/9/test.pdf
变成/view/?file=test.pdf
假设.htaccess
文件将位于内部,我将如何处理/files/users/
?
如果您在我慢慢尝试熟悉的过程中解释您的解决方案如何工作,我将不胜感激mod_rewrite
。
所以,你想把我所有的商业机密都放在银盘上吗?
嗯,我尽力了。;-)
首先,您必须知道文档在哪里。在这里寻找参考:mod_rewrite
。或者mod_rewrite
,如果您的 Apache 版本是 2.2。
您将在Apache mod_rewrite中找到包含大量链接的概述。在那里,您会找到关于重写 URL的精彩介绍。还可以在这里查看许多标准示例。
由于 mod_rewrite 支持 PCRE 正则表达式,因此您可能不时需要perlre和/或regular-expression.info。
现在回答你的问题
RewriteEngine On
RewriteRule ^(?:.+?)/(.*) /view/?file=$1
这可能已经足够了。(?:.+?)
它在该子目录中查找子目录/files/users
并捕获文件的名称(.*)
。如果此模式匹配,它会重写 URL/view/?file=
并将捕获的文件附加到$1
,这给出/view/?file=$1
.
当然,所有未经测试的人都玩得开心。
PS 附加信息在.htaccess info和.htaccess faq处。
将以下指令放入您的.htaccess
文件中以重写 /files/users/9/test.pdf
为/view/?file=test.pdf
. 实际上,这意味着如果您访问http://yourdomain.com/files/users/9/test.pdf ,那么将为访问者提供重写的 url,即http://yourdomain.com/view?file=test .pdf
RewriteRule ^[^/]+/(.*)$ /view/?file=$1 [L]
RewriteRule指令是 Apache mod_rewrite模块的一部分。它需要两个参数:
.htaccess
上下文中,前导斜杠/被剥离给我们my/path)。模式^[^/]+/(.*)$
:
^ - the regex must match from the start of the string
[^/] - match everything but forward slash
+ - repetition operator which means: match 1 or more characters
/ - matches a forward slash
(.*) - mathes any characters. The dot means match any character. The star operator means match ANY characters (0 or more). The parantheses means the match is grouped and can be used in backreferences.
$ - the regex must match until the end of the string
替换/view/?file=$1
:
...意味着我们/view/
用查询参数文件重写了文件夹的 URL 路径。查询参数file
将包含模式中的第一个分组匹配,因为我们将$1
值传递给它(这意味着我们的 RewriteRule 模式中的第一个匹配)。
旗帜[L]
:
...意味着mod_rewrite将停止处理重写规则。这很方便避免不必要的行为和/或无限循环。