用于生成链接的 htaccess 重写

用于生成链接的 htaccess 重写

访问控制

你好,

图中显示了我的 htaccess 规则,它会阻止所有不来自此 referer 的请求。但安装的应用程序会在预订后发送一封确认电子邮件,其 URL 结尾如下:

https://website.com/index.php/appointments/index/4a501c802f0a25283ca7a

当我尝试从电子邮件访问链接时,它会阻止我,因为我不是来自引荐来源,我试图添加一条规则来接受任何包含 /index.php/appointments/index/ 以及之后的所有内容的请求。

答案1

图片显示了我的 htaccess 规则,它阻止了所有不来自此引荐来源的请求。

您在“屏幕截图”中发布的代码似乎并没有按照您所说的那样做 - 它似乎做了相反的事情?(这似乎是您的“编辑/不起作用”的版本?)

仅允许具体的 Referer或者访问如上所述的 URL 类型,无论如何Referer,您都需要执行以下操作:

RewriteEngine On

RewriteCond %{REQUEST_URI} !^/index.php/appointments/index/
RewriteCond %{HTTP_REFERER} !^https://www\.referrer\.com/url/to/allow$
RewriteRule ^ - [F]

请注意,这不允许直接请求(即不允许Referer),因此有些用户会遇到问题。(请注意,来自电子邮件客户端的链接通常被视为直接请求。)

一般来说,你应该尽可能严格地限制正则表达式。在你的文本中,你声明了“任何包含/index.php/appointments/index/和之后所有内容的请求”。然而,示例 URL 似乎显示了 21 个字符的十六进制代码。

RewriteCond %{HTTP_HOST} !^.*(index|appointments).* [NC]

服务器HTTP_HOST变量包含 HTTP 请求标头的值Host。即主机名请求的 URL 不是 URL 路径。但是,您使用的正则表达式无论如何都与请求的 URL 不匹配(它太笼统了)。

答案2

这是我目前的解决方案,它可能不如我想要的那么准确,但如果将来有人有同样的问题,它就会起作用:

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^ index.php
RewriteRule !^(index\.php) [NC,F]
RewriteCond %{HTTP_REFERER} !^somewebsite\.com [NC]
RewriteRule !^ - [L,NC]
RewriteRule !^ - [F,NC]

缺点是用户仍然可以输入 website.com/index.php 我不认为 referer 正在工作,但这是我能想到的最接近的。

只要我理解,我欢迎任何改进或建议。

相关内容