Apache2.4.54 - 重写在 .htaccess 中不起作用

问题描述 投票:0回答:1

我在

/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

我知道这被回答了 1M 次,但即使是没有条件的

RewriteRule ^ /
也不起作用。

我启用了 mod_rewrite 并检查它是否已启用,方法是在

Header set
中包含一个
<IfModule>
并且它有效。

我检查过

AllowOverride All
/path/to/project/
目录中,像这样:

<Directory ${APACHE_ROOT_DIR}/path/to/project>
    AllowOverride All
</Directory

我没有想法了。我希望有人能帮助我。

更新:

我在另一台服务器上测试了重写,重写工作正常。我复制了确切的重写,但它不起作用。我什至重新创建了文件结构。现在只有

mod_rewrite
本身有问题或者服务器
VirtualHost
或simular有问题。

更新 2:

我让它在

sites-available/default-ssl.conf
中工作,但在
.htaccess
中没有。所以问题出在
.htaccess
mod_rewrite
的组合中。因为
.htaccess
Header set test test
一起工作,而
mod_rewrite
default-ssl.conf
中工作。

apache .htaccess mod-rewrite url-rewriting
1个回答
0
投票

我觉得你应该一步步追查可能出现的问题
请不要参加一些测试,因为每个测试都需要自己证明!

执行此操作时,请保持所需的

virtualhost.conf

。在 
default-ssl.conf
 和您的 
virtualhost.conf
 之间跳转可能会提供一些提示,但在尝试在一系列测试中系统地追踪问题时没有帮助。

1。访问权限

请确认访问者被允许访问该目录。所以添加

Require all granted

,如果还没有:

文件:

httpd.conf

或包含
*.conf

<Directory "/var/www/vhosts/myhost/htdoc/PATH/TO/PROJECT"> Require all granted AllowOverride All </Directory>
重新配置后需要重新启动 Apache 守护程序:

在网络服务器上发出命令:

apachectl -k graceful
打开您的项目网址

http://example.com/PATH/TO/PROJECT/

你应该
not看到一个403 Access denied

=> 否则必须先解决这个问题。 (索引文件 0 存在?/Apache 正确重启?/任何重写规则?)

2。查看

.htaccess
文件的使用情况

AllowOverride All

 
.htaccess
 文件的用法应该有效。请测试它,因为错别字等会使任何假设无效:

在你的项目文件夹

.htaccess

中添加一行废话:

文件:

/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/

应该
not产生a

500 Server Error
=>如果发生这种

500

,则模块
mod_rewrite
未加载。

当测试呈阳性时,您可以重新启用模块检查。


对于我的项目,我对这一步三思而后行,因为清楚地看到服务器问题可能比通过不评估重写规则而产生模糊的副作用更好。

4。检查并发重写规则

重写规则由 dir 评估 dir:

1. /.htaccess 2. /PATH/.htaccess 3. /PATH/TO/.htaccess 4. /PATH/TO/PROJECT/.htaccess
因此父目录中的任何规则都可能以无法访问项目目录并且不会触发其中任何规则的方式操纵 REQUEST_URI。

=> 如果父目录中有规则,则在测试时禁用它们。

=> 不要忘记检查 apache CONF 文件中的并发重写规则。

要查看 ReWrite 的工作情况,请启用 DEBUG 功能。为您的 VirtualHost 定义扩展您的

LogLevel

LogLevel notice rewrite:trace5
现在(在

apachectl -k greaceful

之后)error_log应该被过度填充。

对于父目录中的所有重写规则,应该有一组行:

... applying pattern ... ... pass through .... # or ... applying pattern ... ... RewriteCond: .... => not-matched, ... ... pass through ....
对于项目的线条,应该有一组线条(以及更多),例如:

... applying pattern ... ... RewriteCond: .... => matched ... rewrite ....
考试怎么样?

=> 可能有助于提供日志文件

5。定义适当的

RewriteBase

文件:

/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 可能会更好。 

(提供反馈?日志文件?)


请为每一步提供一个简短的结果。

© www.soinside.com 2019 - 2024. All rights reserved.