Cha*_*had 5 mod-rewrite .htaccess apache-2.4
我有一个使用 WAMP 的 Windows 环境,效果很好。我刚刚设置我的 Ubuntu 桌面开发环境,这个特定的 mod_rewrite 不起作用。
这是非常基本的,但是如果我去,我会从 apache
example.local/files/a-real-file.pdf得到一个。404 not found如果我转到
example.local/files.php/a-real-file.pdf该文件,就会按预期显示。如果我去,
example.local/files.php/non-existing-file.who.cares我会var_dump($thelink)从我的逻辑中得到预期的结果files.php。
.htaccess在我的网络根目录中
RewriteEngine On
RewriteRule ^files/(.*)$ files.php/$1
Run Code Online (Sandbox Code Playgroud)
我的 apache 虚拟主机配置
<VirtualHost *:80>
ServerName reqapp.localhost
DocumentRoot /var/www/html/aaApp/public_html
<Directory /var/www/html/aaApp/public_html/>
Options +Indexes +Includes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
为了更好地衡量,“localhost”conf
<VirtualHost *:80>
ServerName localhost
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
以及“适用”部分apache2.conf
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Run Code Online (Sandbox Code Playgroud)
根据phpinfo() mod_rewrite加载。如果文件中存在语法错误.htaccess,站点就会崩溃。
我不知道还能去哪里看。我无法对.conf应该影响此目录的“{mods|conf|sites}-enabled”文件中的任何其他文件进行罚款。
可能值得一提的是,我还运行了一个 Joomla 实例,并且 SEF 与它运行良好。
Run Code Online (Sandbox Code Playgroud)Options +Indexes +Includes +FollowSymLinks +MultiViews
您需要禁用MultiViews(或者干脆不启用它)。例如:
Options +Indexes +Includes +FollowSymLinks -MultiViews
Run Code Online (Sandbox Code Playgroud)
Options或者,如果服务器上尚未启用它,则将其从指令中完全删除。
启用后,mod_negotiation 将在mod_rewrite 测试请求之前MultiViews触发内部子请求files.php(无需请求成功所需的附加路径名信息)。因此模式永远不会匹配并且重写不会发生。RewriteRule
MultiViews 是 mod_negotiation(内容协商)的一部分。您的情况的问题是您正在请求/files/...(在有效的目录中 - 文档根目录)并且该目录中存在具有该基本名称(即 )的文件files。如果您提出请求/bar/...(可能不存在),那么您就不会遇到此问题。
当您请求时/files/...,MultiViews 会导致 Apache搜索适当的资源(files.*本质上是尝试各种文件扩展名),直到找到具有预期 mime 类型的响应。“问题”是,这种情况发生在请求的早期,因此经常与 mod_rewrite 发生冲突。
MultiViews 是一种启用无扩展 URL 的简单方法(无需重写 URL)。然而,一旦你需要做一些更复杂的事情,那么它可能会与 mod_rewrite 发生冲突——这是一个常见的问题。默认情况下,Apache 上未启用 MultiViews(但是,某些共享主机确实启用了它)。