首页 > 解决方案 > 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,因为我只想对与此类似的少数文件执行此操作。

更新我

试图得到一个明确的测试。测试设置:

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,但我看不到任何其他解释。我可以深入研究它,也许可以在控制器中找到正在执行此操作的位置。不过也得休息一下。

标签: .htaccessmod-rewriteurl-rewritingrequest-uri

解决方案


我无法确定为什么服务器配置或站点代码会强制 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 上的一篇帖子中找到了这个解决方案。


推荐阅读