我对mod_rewrite
很糟糕但是我需要将对文件夹/files/users/*/
(*是通配符)的任何请求重写为/view/
,并将文件名插入到查询参数中,如下所示:
/files/users/9/test.pdf
变为/view/?file=test.pdf
假设.htaccess
文件位于/files/users/
内,我将如何解决这个问题?
如果您解释了解决方案的工作原理,我会非常感激,因为我正在慢慢地尝试熟悉mod_rewrite
。
答案 0 :(得分:0)
您可以在/files/users
目录中的.htaccess文件中尝试此操作:
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /files/users
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^[^/]+/test\.pdf /view/?file=test.pdf [L]
无声地映射
http://example.com/files/users/anything/test.pdf
要
http://example.com/view/?file=test.pdf
假设字符串files
,users
和文件名是固定的,而假设anything
是动态的。
对于永久重定向,请将[L]
替换为[R=301,L]
如果替换网址为
http://example.com/files/users/view/?file=test.pdf
替换:
RewriteRule ^[^/]+/test\.pdf /view/?file=test.pdf [L]
使用:
RewriteRule ^[^/]+/test\.pdf view/?file=test.pdf [L]
答案 1 :(得分:0)
那么,你想把我所有的商业机密都放在银盘上吗?
好吧,我尽我所能。 ; - )
首先,您必须知道文档的位置。在这里查看参考:mod_rewrite
。或者mod_rewrite
,如果你的Apache版本是2.2。
您可以在Apache mod_rewrite找到包含大量链接的概述。在那里,你会找到一个很好的introduction来重写网址。还可以在这里查看大量标准示例。
由于mod_rewrite支持PCRE正则表达式,因此您可能不时需要perlre和/或regular-expression.info。
现在回答你的问题
RewriteEngine On
RewriteRule ^(?:.+?)/(.*) /view/?file=$1
这可能已经足够了。它在(?:.+?)
中查找子目录/files/users
,并在此子目录中捕获文件(.*)
的名称。如果此模式匹配,则会将网址重写为/view/?file=
,并使用$1
附加捕获的文件,这会提供/view/?file=$1
。
所有未经测试的,当然都很有趣。
P.S。有关其他信息,请访问.htaccess info和.htaccess faq。
答案 2 :(得分:0)
将以下指令放入您的.htaccess
文件中重写 /files/users/9/test.pdf
至/view/?file=test.pdf
。实际上,这意味着如果您访问http://yourdomain.com/files/users/9/test.pdf,则访问者将获得重写的网址,即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 将停止处理重写规则。这样可以避免不必要的行为和/或无限循环。