Apache mod_重写与简单重定向不匹配
我对Apache mod_重写与简单重定向不匹配,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我对mod\u rewrite有一个奇怪的问题。我的网站的设置方式是,用户可以通过URL(如example.com/pt/about)访问网页的翻译版本,或者只访问普通页面(如soexample.com/about),为此,我在中提供了以下内容 RewriteEngine On RewriteCond %{SCRIPT_FILENAME} !-d RewriteCond %{SCRIPT_FILENAME} !-f RewriteRule ^(en|pt)/?$ index.php?lang=
mod\u rewrite
有一个奇怪的问题。我的网站的设置方式是,用户可以通过URL(如example.com/pt/about
)访问网页的翻译版本,或者只访问普通页面(如soexample.com/about
),为此,我在中提供了以下内容
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(en|pt)/?$ index.php?lang=$1 [NC,QSA,L]
RewriteRule ^about/?$ about.php [NC,QSA,L]
RewriteRule ^contact/?$ contact.php [NC,QSA,L]
RewriteRule ^([A-Za-z]{2})/about/?$ about.php?lang=$1 [NC,QSA,L]
RewriteRule ^([A-Za-z]{2})/contact/?$ contact.php?lang=$1 [NC,QSA,L]
在我的开发机器上,我用Apache2.4.29运行XAMPP3.2.2,在我的生产服务器上,我用Apache2.4.18运行Ubuntu 16.04.3 LTS。在我的开发机器中,一切正常,如果我尝试访问/about
它会显示about.php
,如果我尝试/pt/about
它会将页面翻译成葡萄牙语,这是正确的行为,但是在生产服务器中,如果我尝试访问/about
我会得到一个404错误,但是如果我尝试访问/pt/about
,它会正确显示页面,没有任何问题
为什么会发生这种情况以及我如何纠正它?来自:
RewriteBase指令指定用于替换相对路径的每个目录(htaccess)RewriteRule指令的URL前缀
在每个目录(htaccess)上下文中的替换中使用相对路径时,除非满足以下任何条件,否则需要此指令:
原始请求和替换位于DocumentRoot下面(而不是通过其他方式(如Alias)可以访问)
包含重写规则的目录的文件系统路径(以相对替换作为后缀)在服务器上作为URL路径也是有效的(这种情况很少见)
在Apache HTTP Server 2.4.16及更高版本中,当通过Alias或mod_userdir映射请求时,可以省略此指令
我认为问题在于配置差异,可以通过在代码中添加RewriteBase/
来解决,所以应该是这样的:
RewriteEngine On
RewriteBase /
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(en|pt)/?$ index.php?lang=$1 [NC,QSA,L]
RewriteRule ^about/?$ about.php [NC,QSA,L]
RewriteRule ^contact/?$ contact.php [NC,QSA,L]
RewriteRule ^([A-Za-z]{2})/about/?$ about.php?lang=$1 [NC,QSA,L]
RewriteRule ^([A-Za-z]{2})/contact/?$ contact.php?lang=$1 [NC,QSA,L]
只是尝试了这个,显然没有什么不同,这真的是一个奇怪的问题。好吧,尝试清除浏览器缓存并再次测试它,如果没有什么让我知道,我想在所有代码中做一些更改尝试了所有可能的方法,包括在不同的机器上尝试,似乎没有任何效果。