我在
/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
中工作。
我觉得你应该一步步追查可能出现的问题
请不要参加一些测试,因为每个测试都需要自己证明!
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/
:你应该
403 Access denied
=> 否则必须先解决这个问题。 (索引文件 0 存在?/Apache 正确重启?/任何重写规则?).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
未加载。当测试呈阳性时,您可以重新启用模块检查。
对于我的项目,我对这一步三思而后行,因为清楚地看到服务器问题可能比通过不评估重写规则而产生模糊的副作用更好。
1. /.htaccess
2. /PATH/.htaccess
3. /PATH/TO/.htaccess
4. /PATH/TO/PROJECT/.htaccess
因此父目录中的任何规则都可能以无法访问项目目录并且不会触发其中任何规则的方式操纵 REQUEST_URI。=> 如果父目录中有规则,则在测试时禁用它们。
=> 不要忘记检查 apache CONF 文件中的并发重写规则。
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 可能会更好。 (提供反馈?日志文件?)