我在/path/to/project/
中有这个.htaccess文件
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !system
RewriteRule ^(.*)/([^/]+)/?$ $1/some/folders/$2.php [PT]
</IfModule>
如您所见,我想将https://example.com/path/to/project/folder
重定向到https://example.com/path/to/project/some/folders/folder
。
我知道这个问题已经被回答了100万次,但即使是没有条件的RewriteRule ^ /
也不起作用。
我已经启用了mod_rewrite,并通过在<IfModule>
中包含Header set
来检查它是否已启用,并且它工作正常。
我已经检查了AllowOverride All
在/path/to/project/
目录中,如下所示:
<Directory ${APACHE_ROOT_DIR}/path/to/project>
AllowOverride All
</Directory>
我已经没有主意了。我希望有人能帮助我。
更新:
我在另一台服务器上测试了重写,重写工作。我复制了完全相同的重写,但它不工作。我甚至重新创建了文件结构。现在只有mod_rewrite
本身有问题,或者服务器VirtualHost
或simulal有问题。
更新2:
我让它在sites-available/default-ssl.conf
中工作,但在.htaccess
中不工作。所以问题是在.htaccess
和mod_rewrite
的组合中。因为.htaccess
与Header set test test
一起工作,而mod_rewrite
在default-ssl.conf
中工作。
1条答案
按热度按时间inn6fuwd1#
我认为你应该一步一步地找出可能出现的问题。
在执行此操作时,请保持在所需的
virtualhost.conf
。在default-ssl.conf
和virtualhost.conf
之间跳转可能会给予一些提示,但当试图在一系列测试中系统地跟踪问题时,这是没有帮助的。1.访问权限
请验证访问者是否被允许访问该目录。因此,如果还不存在
Require all granted
,请添加Require all granted
:文件:
httpd.conf
或包含的*.conf
重新配置后,需要重新启动Apache守护进程:
在Web服务器上发出以下命令:
打开您的项目URL
http://example.com/PATH/TO/PROJECT/
:您不应该看到
403 Access denied
=〉否则这个问题必须首先解决。(index file 0存在吗?/ Apache重新启动是否正确?/任何重写规则?)
***状态更新:****功能正常 *
2.检查
.htaccess
文件的使用情况通过
AllowOverride All
,.htaccess
文件的使用应该可以工作。请测试它,因为错别字等可以使任何假设无效:在项目文件夹的
.htaccess
中添加一行无意义的内容:File:
/var/www/vhosts/myhost/htdoc/PATH/TO/PROJECT/.htaccess
调用页
http://example.com/PATH/TO/PROJECT/
应生成一个删除
.htaccess
中的无意义行,并再次调用该页面:=〉
500
错误应该消失。.htaccess
由Apache评估,如果行为如所述。****状态更新:****功能正常 *
3.检查重写引擎是否存在
可以肯定的是,重写引擎是存在的,并且
.htaccess
文件被访问:删除或设置为注解模块检查mod_rewrite.c
,但保持活动的RewriteEngine On
:调用页面
http://example.com/PATH/TO/PROJECT/
应该***不***产生一个=〉如果
500
发生,则模块mod_rewrite
未加载。当测试结果为阳性时,您可以重新启用模块检查。
***状态更新:****功能正常 *
4.检查并发ReWrite规则
重写规则按目录进行评估:
因此父目录中的任何规则都可能以一种方式操作REQUEST_URI,即不会到达项目的目录,也不会触发其中的任何规则。
=〉如果父目录中有规则,在测试时禁用它们。
=〉不要忘记检查apache CONF文件中的并发ReWrite规则。
要查看ReWrite的工作情况,请启用DEBUG功能。为VirtualHost定义扩展
LogLevel
:现在(在
apachectl -k graceful
之后)error_log应该被过度填充。对于父目录中的所有重写规则,应该有一组行:
对于项目的行,应该有一组行(以及更多行),如:
测试如何?*=〉可能有助于提供日志文件 *
状态更新:
1.* 之前执行过重写规则 *
1.* 没有任何重写规则退出
[L]
eave的评估。(
[L]
不会成为问题,因为在RewriteRule ... [L]
重写后将重新开始评估)*1.* 至少有一个先前评估的重写规则以非预期的方式更改了项目的URI(将DocumentRoot添加到URI),从而引发了问题。*
=〉更改相关规则解决了问题。
5.定义合适的
RewriteBase
File:
/var/www/vhosts/myhost/htdoc/PATH/TO/PROJECT/.htaccess
根据细节和进一步的上下文,另一个RewriteBase可能更好。(提供反馈?日志文件?)
请为每个步骤提供一个简短的结果。