问题描述
最奇怪的事情。两条重写规则都在我们的测试服务器上运行,但是第二条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上的符号链接驱动器