好的,首先,如果这个问题之前有人问过,我深表歉意。我搜索了一下,但没有立即找到合适的内容。
我一直在查看 Apache 文档,但就是无法让这个重写工作,尽管它看起来很简单,所以我一定是遗漏了一些简单的东西。
我的 vhost conf 文件如下所示:
<VirtualHost *:80>
ServerName xxxxx.local
DocumentRoot /var/www/html/configManager
DirectoryIndex index.php
<Directory /var/www/html/configManager>
AllowOverride All
Order Allow,Deny
Allow from All
<IfModule mod_rewrite.c>
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [QSA,L]
</IfModule>
</Directory>
</VirtualHost>
对我来说,这意味着:重定向所有内容,不捕获任何内容,到 index.php 但如果我去http://xxxxx.local/Listmanager/view/5我得到了 404。对于除“/”之外的任何内容,我都得到了 404。
我尝试添加别名,使用 mod_dir 而不是 mod_rewrite,但得到的最佳结果是 403 或 404。
您可能从 URL 中看到,我正在尝试以 MVC 样式编写此应用程序,但看起来服务器始终在寻找文件系统路径,而不仅仅是传递所有内容。
任何帮助将不胜感激。
答案1
这是针对您的要求配置 HTTPD 的当前正确方法:
<VirtualHost *:80>
ServerName xxxxx.local
DocumentRoot /var/www/html/configManager
DirectoryIndex index.php
FallbackResource /index.php
<Directory /var/www/html/configManager>
Require all granted
Options none
AllowOverride none
</Directory>
</VirtualHost>
笔记:
后备资源是一个 mod_dir 指令,用于将不存在的所有内容指向单个控制器页面。在 2023 年,这是实现此目的的方法,而不是阴险老旧且复杂的方法:RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ index.php [QSA,L] # QSA 不需要在此处添加,当您未指定目标查询字符串时,Apache 会自动添加它们。最好不要复制粘贴。
请记住不要使用 Allow、Deny、Satisfy,它们是已弃用的旧 2.2 指令并卸载 mod_access_compat,这是一个仅用于与旧指令兼容的模块,并不旨在扩展已弃用方式的使用。
关于: ”选项 无“如果 apache 抱怨,您可能必须添加 +FollowSymlinks,这取决于您是否稍后添加 mod_rewrite 指令,但在大多数简单情况下,这是可行的方法。
关于 ”AllowOverride 无“除非您想允许非管理员用户配置某些目录的权限,否则不要使用 .htaccess,您添加的“每个目录”重写等越多,您的配置就会越复杂和令人费解,因此尽可能坚持在虚拟主机上下文中配置重定向/重写等。如果您需要的所有配置都是简单的重定向,我建议您检查 mod_alias (Redirect、RedirectMatch) 而不是 mod_rewrite (它是一把瑞士军刀)。
答案2
哦,用垃圾桶把我杀了!模块未启用!