htaccess第二个重写规则不适用于生产

问题描述

最奇怪的事情。两条重写规则都在我们的测试服务器上运行,但是第二条locations在生产环境上不起作用,并且出于某种原因在/的末尾添加了locations/。两台服务器上的配置相同。

我正在尝试简化URL,而不重命名文件。这样,如果用户输入site.php/locations,它将加载重定向页面的内容,但保留简化的URL

关于为什么locations重定向不起作用的任何想法?

RewriteEngine on
RewriteBase /

// The next two are statements are just for context. They preceded the faq and locations forward 
RewriteCond %{REQUEST_URI} ^/index.php$
RewriteRule (.*) / [R=301,L]

// The two rewrites that I want
RewriteRule ^faq$ /faq-mailbox-account.php [NC,L]
RewriteRule ^locations$ /choose-digital-mailbox-location.php [NC,L]

解决方法

...关于生产,并出于某种原因在/的末尾添加一个locations/

如果locations作为文件系统上的物理目录存在,则会发生这种情况。 (或已存在,并且响应已缓存。)

如果您请求/locations并且/locations作为物理目录存在,则mod_dir将发出301外部重定向以附加尾随斜杠-通常,这是“固定” URL所必需的。

无论您的规则是否匹配,都会发生由mod_dir进行的外部“重定向” * 1 ,因为它只是“ 内部重写” / em>,而不是其他重定向。 ( * 1 实际上,它确实匹配并且确实发生了重写,但是它实际上被mod_dir重定向所覆盖。)

您可以在您的RewriteRule 模式中添加一个可选斜杠,例如。 ^locations/?$-但是,如果您请求/locations时不带斜杠,则重定向仍将首先发生。您需要请求一个已经包含斜杠的URL。

您可以使用DirectorySlash Off阻止mod_dir附加尾部斜杠,但是,这可能会对您的系统产生其他影响。

还请注意,由于这是301(永久)重定向,因此您的浏览器可能会将其永久缓存。因此,如果此后在服务器上删除了/locations目录,浏览器仍将重定向用户,直到所有客户端缓存也都被清除为止。

两台服务器上的配置相同。

因此,两台服务器上都有一个/locations目录(或 )?

如果两台服务器上的配置都相同,那么您将获得相同的响应,因此必须有所不同。或者,存在客户端缓存问题。

这样,如果用户输入site.php/locations

我假设您的意思是site.com/locations-否则,您发布的指令将无法运行,因为它们根本不匹配。

,

问题是由于Prod上的符号链接驱动器

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...