Apache2.4.54 -重写在.htaccess中无效

z9zf31ra  于 2023-04-21  发布在  Apache
关注(0)|答案(1)|浏览(116)

我在/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中不工作。所以问题是在.htaccessmod_rewrite的组合中。因为.htaccessHeader set test test一起工作,而mod_rewritedefault-ssl.conf中工作。

inn6fuwd

inn6fuwd1#

我认为你应该一步一步地找出可能出现的问题。

  • 不要参加某些测试,因为每个测试都需要自己的证明!*

在执行此操作时,请保持在所需的virtualhost.conf。在default-ssl.confvirtualhost.conf之间跳转可能会给予一些提示,但当试图在一系列测试中系统地跟踪问题时,这是没有帮助的。

1.访问权限

请验证访问者是否被允许访问该目录。因此,如果还不存在Require all granted,请添加Require all granted
文件:httpd.conf或包含的*.conf

<Directory "/var/www/vhosts/myhost/htdoc/PATH/TO/PROJECT">
    Require all granted
    AllowOverride All
</Directory>

重新配置后,需要重新启动Apache守护进程:
在Web服务器上发出以下命令:

apachectl -k graceful

打开您的项目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

asflksdflkj

调用页http://example.com/PATH/TO/PROJECT/应生成一个

500  Server Error

删除.htaccess中的无意义行,并再次调用该页面:
=〉500错误应该消失。

  • .htaccess由Apache评估,如果行为如所述。*
    ***状态更新:****功能正常 *

3.检查重写引擎是否存在

可以肯定的是,重写引擎是存在的,并且.htaccess文件被访问:删除或设置为注解模块检查mod_rewrite.c,但保持活动的RewriteEngine On

# <IfModule mod_rewrite.c>
    RewriteEngine On
# </IfModule>

调用页面http://example.com/PATH/TO/PROJECT/应该***不***产生一个

500  Server Error

=〉如果500发生,则模块mod_rewrite未加载。
当测试结果为阳性时,您可以重新启用模块检查。

  • 对于我的项目,我会再三考虑这一步,因为它可能更好地清楚地看到服务器问题,而不是通过未评估的重写规则获得模糊的副作用。*
    ***状态更新:****功能正常 *

4.检查并发ReWrite规则

重写规则按目录进行评估:

1.  /.htaccess
2.  /PATH/.htaccess
3.  /PATH/TO/.htaccess
4.  /PATH/TO/PROJECT/.htaccess

因此父目录中的任何规则都可能以一种方式操作REQUEST_URI,即不会到达项目的目录,也不会触发其中的任何规则。
=〉如果父目录中有规则,在测试时禁用它们。
=〉不要忘记检查apache CONF文件中的并发ReWrite规则。
要查看ReWrite的工作情况,请启用DEBUG功能。为VirtualHost定义扩展LogLevel

LogLevel  notice rewrite:trace5

现在(在apachectl -k graceful之后)error_log应该被过度填充。
对于父目录中的所有重写规则,应该有一组行:

... applying pattern ...
... pass through ....

# or
... applying pattern ...
... RewriteCond: ....  => not-matched, ...
... pass through ....

对于项目的行,应该有一组行(以及更多行),如:

... applying pattern ...
... RewriteCond: ....  => matched
... rewrite ....

测试如何?*=〉可能有助于提供日志文件 *

状态更新:

1.* 之前执行过重写规则 *
1.* 没有任何重写规则退出[L] eave的评估。
[L]不会成为问题,因为在RewriteRule ... [L]重写后将重新开始评估)*
1.* 至少有一个先前评估的重写规则以非预期的方式更改了项目的URI(将DocumentRoot添加到URI),从而引发了问题。*

=〉更改相关规则解决了问题。

5.定义合适的RewriteBase

File:/var/www/vhosts/myhost/htdoc/PATH/TO/PROJECT/.htaccess

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !system

RewriteRule ^(.*)/([^/]+)/?$ $1/some/folders/$2.php [PT]

根据细节和进一步的上下文,另一个RewriteBase可能更好。(提供反馈?日志文件?)
请为每个步骤提供一个简短的结果。

相关问题