用 .htaccess 重写不起作用

Posted

技术标签:

【中文标题】用 .htaccess 重写不起作用【英文标题】:Rewriting with .htaccess doesn't work 【发布时间】:2015-09-06 15:42:05 【问题描述】:

我正在尝试通过在 .htaccess 中使用 RewriteRule 使 URL 看起来更好,但它不起作用。

就是这样。我有一个根文件夹,其中有一个名为 pdf.php 的 PHP 文件。该文件中的脚本向用户发送一个 PDF 文件,该文件的名称在 URL 中作为变量给出。 PDF 文件位于名为 pdf 的文件夹中,位于根目录下。该文件夹受到保护,因此只能使用脚本获取 PDF 文件。所有这些都是出于安全原因。

例如,当您转到http://example.com/pdf.php?file=pdf/File.pdf 时,您可以下载 PDF 文件,其中 pdf/File.pdf 是 PDF 文件的路径。这工作正常。我希望它在您只需转到http://example.com/pdf/File.pdf 时就可以工作,因此必须将 URL 重写为前面提到的那个。

我尝试使用生成器创建 RewriteRule,但它不起作用。 以下规则位于 pdf 文件夹中的 .htaccess 文件中。将它放在根目录中也不起作用。

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^pdf/([^/]*)$ /pdf.php?file=pdf/$1

文件夹pdf的保护如下。

ErrorDocument 403 http://example.com/
Order deny,allow
Deny from all

【问题讨论】:

附加一组您所追求的源和目标 URL。到目前为止你给出了什么规则? 我用 .htaccess 文件中的行更改了我的帖子。 【参考方案1】:

在 root .htaccess 中试试这个代码:

Options +FollowSymLinks -MultiViews
RewriteEngine On

# to convert spaces to hyphens
RewriteRule "^(pdf)/(\S*) +(.*)$" /$1/$2-$3 [L,NE,R=302]

RewriteRule ^(pdf/.+)$ /pdf.php?file=$1 [L,QSA,B,NC]

【讨论】:

我按照你说的做了,但是没用。我仍然收到 403 错误,因为 PDF 文件位于受保护的文件夹中,这意味着重定向不起作用。还有什么我可以尝试的吗? 保护线现在在第一个帖子中。当我删除它们时,您的 RewriteRule 似乎有效,但仅适用于文件名中只有一个单词的 PDF 文件。当名称有两个或多个单词并用空格分隔时,它不起作用。提前致谢! 很遗憾还是一样。 我尝试了一个类似example.com/pdf/File%20name.pdf的URL,其中文件名有两个单词。我得到的错误是 404,当变量中的文件不存在时 PHP 文件返回。 感谢您的回答!

以上是关于用 .htaccess 重写不起作用的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess:使用参数重写 url 不起作用

使用 .htaccess 重写规则时 PHP 函数 file_exists 不起作用

.htaccess 与 EasyPHP:RewriteRule 不起作用

.htaccess url在将php更改为html时重写不起作用

当 REQUEST_URI 不以不同的模式开头时,Htaccess 重写规则不起作用

.htaccess 在 xampp 和 Ubuntu 下不起作用