.htaccess - REQUEST_URI 不匹配显式路径和文件名
问题描述
真的很难过,因为形式和语法看起来都不错。
REQUEST_URI 的 RewriteCond 与显式路径和文件名不匹配。隔离时,REQUEST_FILENAME 的 RewriteCond 匹配得很好。我已经使用 phpinfo() 验证了 REQUEST_URI 包含前导斜杠,并且还测试了没有前导斜杠。
这里的目标是知道该请求是针对此文件的,如果它不存在,则抛出 410。
RewriteCond %{REQUEST_URI} ^/dir1/dir2/dir3/v_9991_0726dd5b5e8dd67a214c0c243436d131_all\.css$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ - [R=410,L]
我不想省略第一个 Cond,因为我只想对与此类似的少数文件执行此操作。
更新我
试图得到一个明确的测试。测试设置:
- testmee.txt 不存在
- 请求是针对根目录中的 testmee.txt
- 通过重定向到谷歌验证 request_uri 是否匹配
- 仅使用第一个 Cond 时无法获得 410
- (仅使用第一个 Cond 时,服务器服务 404,而不是 410)
- (同时使用 Conds,服务器服务 404,而不是 410)
- 仅使用第二个 Cond 时可以得到 410
RewriteCond %{REQUEST_URI} ^/testmee\.txt$
#RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ - [R=410,L]
相对
#RewriteCond %{REQUEST_URI} ^/testmee\.txt$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ - [R=410,L]
更新二
对白先生的回应:
呃,同样的症状。对于过时的 css/js,可能不得不忍受 googlebot 达到 404s 而不是所需的 410。从长远来看,可能没什么大不了的。
感谢您的 request_uri 测试重定向。在这些测试中一切正常。在 var= rewrite URL 中按预期返回页面名称等。
至此,我想一定是对文件类型扩展名相关的404s的一些内部处理。请参阅下面的线索。我有 Prestashop 购物车软件,它必须在文件类型上强制 404。
这将重定向到谷歌(确认模式匹配):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^testmee\.txt$ http://www.google.com/ [L]
(L flag is needed or else other Rules further down will interfere.)
这将继续返回 404 而不是 410:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^testmee\.txt$ - [NC,R=410]
作为对照测试,这将返回 410:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.*$ - [NC,R=410]
如果在上述失败的测试中文件类型是 css,那么我的自定义 404 控制器不会被调用。我只得到一个普通的 404 响应,没有包含我所有网站模板的自定义 404。
例如:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^testmee\.css$ - [NC,R=410]
恐怕我浪费了你的一些时间。我很抱歉。我从没想过 Prestashop 的代码会根据文件类型强制 404,但我看不到任何其他解释。我可以深入研究它,也许可以在控制器中找到正在执行此操作的位置。不过也得休息一下。
解决方案
我无法确定为什么服务器配置或站点代码会强制 htaccess 中的“410 Gone”响应指令被 404 响应覆盖,因此必须执行类似的操作来告诉 googlebot 停止寻找被清除的 CSS/JS 文件定期(并在重新生成时重命名)。
在 .htaccess 中:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule v_(.*)_(.*)$ /410response.php [L]
在根目录下的 410response.php 中:
<?php header($_SERVER['SERVER_PROTOCOL'].' 410 Gone');
更新我
尝试将 htaccess 用于 410 指令时的 404 响应是由服务器强制执行的,因为服务器显然有一个自定义 410 文档,该文档显然路由到 404。添加一个指令以防止然后正确允许使用 htaccess 返回 410用于 RewriteRule 中的模式匹配。(我以为我昨天已经检查过这是否可行,因为@MrWhite 在上面的回答中说要控制服务器可能具有自定义 410;今天进行此检查时,它确实有效并表明服务器 410-to -404 重定向覆盖了我的 410 指令。)
ErrorDocument 410 default
RewriteRule test\.txt$ - [NC,R=410]
白先生!我在您在 Stack Exchange 上的一篇帖子中找到了这个解决方案。
推荐阅读
- r - R xml2:复制文档
- cmake - 在 Windows 上的 CLion 中打开 ESP-IDF 项目作为普通 CMake 项目
- python - 列表中的最小 Levenshtein 距离
- azure - Microsoft.Web/sites/hostNameBindings 的 ARM 模板部署不断给我冲突错误
- ignite - Apache Ignite ArrayList 通过 RDBMS 写入
- python - Kivy,当内容改变大小时,ScrollView 会自动滚动
- ssl - 在 IOT 设备上更新 SHA-1 指纹的方法
- html - css flex box 将文本中心与其下方的按钮对齐
- laravel - 有没有办法从另一台电脑访问我的本地项目
- ruby - 为什么 gem list 显示 gem 已安装,但 gem 在尝试执行时未“找不到”(捆绑程序)