抱歉,我不知道自己在做什么,我需要你的帮助。我有一个 htaccess 文件,它可以进行一些 URL 重写,但它在服务器上不起作用。我认为 mod_rewrite 未启用。但它没有被注释掉,phpinfo() 说它是已启用的模块之一。
我不知道该怎么办。请帮帮我!
来自我的.htaccess 文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
更新:我在 http.conf 中将此行从 none 更改为 all:
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
我保存了它。尝试重新启动 apache(按照我的 IT 人员说的做:/sbin/service httpd restart),但 apache 无法重新启动,提示:
Stopping httpd: [FAILED]
Starting httpd: [FAILED]
(98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
现在我无法回滚,因为我收到了相同的消息...出了什么问题!
答案1
您需要在需要的特定区域中启用 mod_rewrite 功能,无论是在 Location、VirtualHost 还是 .htaccess 中。您可以使用以下方式执行此操作
RewriteEngine on
RewriteRule ^oldstuff\.html$ newstuff.html
您可以通过使用 RewriteLog 和 RewriteLogLevel 选项打开日志记录来查看模块正在做什么:
RewriteLog "/var/log/apache/rewrite.log"
RewriteLogLevel 2
日志级别最高可达 9,但文档警告不要在生产环境中超过 2。我建议在调试完成后将其完全关闭。
您可以在mod_rewrite 文档。
看到您的用法后,似乎您正在尝试将不存在的项目发送到 index.php。您可以在不使用 mod_rewrite 的情况下执行类似操作:
ErrorDocument 404 http://this.server/path/index.php
这会将用户重定向回 index.php 并要求您对位置进行硬编码,这可能并不理想。
或者,我建议反转条件的含义并删除第一个 RewriteRule。“如果请求不是文件、不是链接、也不是目录,则重定向到 index.php”。这将使您的规则更简单。您还可以从 RewriteRules 中删除 [NC] 标志,因为它不会产生任何效果。
RewriteEngine On
RewriteCond ! %{REQUEST_FILENAME} -s
RewriteCond ! %{REQUEST_FILENAME} -l
RewriteCond ! %{REQUEST_FILENAME} -d
RewriteRule ^.*$ index.php [L]
(我还没有检查过这是否有效)
答案2
重新启动 Apache 服务器?