【问题标题】:.htaccess issues with redirect all except certain folders.htaccess 重定向除某些文件夹外的所有问题
【发布时间】:2015-05-09 22:28:22
【问题描述】:

我知道这里有很多这类问题,以及其他教程,我已经尝试了许多建议的解决方案,但由于某种原因,它们并不能 100% 为我工作。这是我希望 htaccess 文件处理的事情的列表

  • 如果不请求 /admin/ 目录,则重定向到 http://example.net/
  • 如果不请求 /about-us.html 文件,则重定向到 http://example.net/
  • 如果请求不以以下格式结束,则重定向到 http://example.net/:.jpg、.jpeg、.png、.gif、.css、.js
  • 将 https:// 重定向到 http://
  • 不允许盗链
  • 不允许目录索引列表(选项 ALL - 索引)
  • 不允许 .htaccess 文件可见

我似乎遇到的最大问题是允许管理目录和 about-us.html 文件。它仍然重定向到站点的根目录。这是我目前所拥有的。

<Files .htaccess>
order allow,deny
deny from all
</Files>

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/about-us.html$
RewriteCond %{REQUEST_URI} !^/admin/*$
RewriteCond %{REQUEST_URI} !^/$
RewriteCond %{REQUEST_URI} !\.(gif|jpeg|jpg|png|css|js)$
RewriteRule (.*) / [R=302]

Options All -Indexes

我在哪里做错了?提前感谢您提供的所有帮助和见解。

【问题讨论】:

  • 我看不到这条规则如何将/about-us.html 重定向到站点根目录。你还有其他规则吗?

标签: apache .htaccess mod-rewrite redirect


【解决方案1】:

好的,一个接一个:

不允许 .htaccess 文件可见

您的 Files 指令似乎没问题,但是,它应该始终放在服务器范围的配置文件中,而不是放在 .htaccess 本身中。您应该考虑隐藏所有以点开头的文件。此外,“全部满足”确保即使用户通过 HTTP 身份验证方案进行身份验证,这些文件也无法访问。

<Files ~ "^\.">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

不允许目录索引列表(选项 ALL - 索引)

您只需要“选项-索引”

不允许盗链

检查推荐人:

RewriteCond %{HTTP_REFERER} !^($|https?://(www\.)?example\.net)
RewriteRule \.(gif|jpe?g|png|css|js)$ - [R=403] 

如果referer不为空且不包含example.net的url,则发送http/1.0 403 Forbidden。请记住,您不能依赖引用标头。它可能不存在,在这种情况下,您必须允许访问不要阻止您自己的页面,如果给定它可能是错误的,但是您可能会争辩说这是访问者的责任。

将 http:// 重定向到 https://

通常应该反过来,通过使用 ssl/tls 确保访问者的安全。但是你在这里:

RewriteCond %{HTTPS} =on
RewriteRule ^/?(.*) http://%{SERVER_NAME}/$1 [R=301,L]

最好适当配置虚拟主机。

如果不请求 /admin/ 目录,则重定向到 http://example.net/
如果不请求 /about-us.html 文件,则重定向到 http://example.net/
如果请求不以以下方式结束,则重定向到 http://example.net/:.jpg、.jpeg、.png、.gif、.css、.js

最简单的方法是使用重写链并在重定向所有剩余的之前允许特殊请求(用 [L] als last 规则标记):

RewriteRule ^/?admin/                 -  [L]
RewriteRule ^/?about-us\.html         -  [L]
RewriteRule \.(jpe?g|png|gif|css|js)  -  [L]
rewriteRule ^/?(.*)    http://example.net/$1    [R=302]

(顺便说一句:如果您已将页面移动到新 url,请始终使用 R=301(永久移动)作为重定向代码,以便 google 和其他搜索引擎不会将两个 url 作为重复内容处理。)

并使用 RewriteBase 设置前面的 Base 目录(在您的情况下只是“/”)。

您的完整 .htaccess 文件如下所示:

Options -Indexes

<Files ~ "^\.">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

RewriteEngine on
RewriteBase /

RewriteCond %{HTTP_REFERER} !^($|https?://(www\.)?example\.net)
RewriteRule \.(gif|jpe?g|png|css|js)$ - [R=403] 

RewriteCond %{HTTPS} =on
RewriteRule ^(.*) http://%{SERVER_NAME}/$1 [R=301,L]

RewriteRule ^admin/                        -  [L]
RewriteRule ^about-us\.html                -  [L]
RewriteRule \.(jpe?g|png|gif|css|js)       -  [L]
rewriteRule ^(.*)    http://example.net/$1    [R=302]

编辑(由于理解错误):

以上示例适用于外部重定向到不同域(此处为 example.net)。如果只有同一域上的本地重定向(例如到“/”),您需要将最后一条规则替换为:

Rewriterule ^$    -     [L]
RewriteRule ^.*   /     [R=302,L] 

防止重定向循环。

【讨论】:

  • 当我尝试这个时,我的浏览器中出现了一个无限重定向循环。我不确定问题可能出在哪里。这显然是一个彻底的解决方案,我非常感谢。但根据我的经验,我找不到问题。
  • 我在referer检查的正则表达式中犯了一个错误,现在已经更正了
  • @robotsushi:如果服务器配置为正常重定向到 https(服务器范围的配置),或者您的目标域(example.net)具有相同的 document_root/directory,则可能会出现无限循环原来的。此 .htaccess 仅适用于原始域。
  • 您还应该检查您是否没有可能将浏览器重定向回旧域的 html 元标记。
  • 非常感谢您对此的努力。我已经复制了当前版本,但仍然出现重定向循环错误。我应该提一下,没有用于将先前域重定向到当前域的重定向。只涉及一个域。我已经注释掉了这个 htaccess 文件的不同部分,但仍然出现重定向循环错误。
猜你喜欢
  • 2021-06-13
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 2012-11-04
  • 2016-08-23
  • 1970-01-01
  • 2014-10-17
  • 1970-01-01
相关资源
最近更新 更多