.htaccess重写/files/users/1/file.pdf到/view/?file=file.pdf

时间:2013-02-26 14:48:28

标签: .htaccess mod-rewrite

我对mod_rewrite很糟糕但是我需要将对文件夹/files/users/*/(*是通配符)的任何请求重写为/view/,并将文件名插入到查询参数中,如下所示:

/files/users/9/test.pdf变为/view/?file=test.pdf

假设.htaccess文件位于/files/users/内,我将如何解决这个问题?

如果您解释了解决方案的工作原理,我会非常感激,因为我正在慢慢地尝试熟悉mod_rewrite

3 个答案:

答案 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

假设字符串filesusers和文件名是固定的,而假设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模块的一部分。它需要两个参数:

  1. 模式 - 与当前网址路径匹配的regular expression(请注意,网址路径不是整个网址,例如。 / my / path ,但在.htaccess上下文中,前导斜杠 / 被剥离,为我们提供 my / path )。
  2. 替换 - 用户将重写或重定向到的目标网址或路径。
  3. 解释规则

    模式^[^/]+/(.*)$

    ^    - 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 将停止处理重写规则。这样可以避免不必要的行为和/或无限循环。