我有一个使用 WAMP 的 Windows 环境,它运行良好。我刚刚设置了我的 Ubuntu 桌面开发环境,这个特定的 mod_rewrite 不起作用。
这很简单,但如果我转到,
example.local/files/a-real-file.pdf
我会从 apache 获得一个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
我的 apache vhost 配置
<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>
并且为了更好的测量,“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>
以及“适用”部分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>
根据phpinfo()
mod_rewrite
加载。如果文件中出现语法错误.htaccess
,网站就会崩溃。
我不知道还能去哪里找。我无法.conf
在“{mods|conf|sites}-enabled”文件中发现任何其他文件会影响此目录。
值得一提的是,我也有一个正在运行的 Joomla 实例,并且 SEF 运行良好。
答案1
Options +Indexes +Includes +FollowSymLinks +MultiViews
您需要禁用MultiViews
(或者简单地不启用它)。 例如:
Options +Indexes +Includes +FollowSymLinks -MultiViews
Options
或者如果它还没有在服务器上启用,则将其从指令中完全删除。
启用后MultiViews
,mod_negotiation 将触发内部子请求files.php
(无需额外的路径名信息这是您的请求成功所必需的)前mod_rewrite 开始测试请求。因此RewriteRule
图案永远不会匹配,并且不会发生重写。
详细...
MultiViews 是 mod_negotiation (content-negotiation) 的一部分。您的问题在于,您正在请求/files/...
(在有效目录 - 文档根目录中),并且files
该目录中存在具有该基本名称(即)的文件。如果您要请求/bar/...
(可能不存在),那么您就不会遇到此问题。
当你请求时/files/...
,MultiViews 会在 Apache 中产生搜索寻找合适的资源(files.*
本质上是尝试各种文件扩展名),直到找到具有预期 mime 类型的响应。“问题”在于,这种情况在请求的早期就发生了,因此经常与 mod_rewrite 发生冲突。
MultiViews 是一种启用无扩展 URL(不需要 URL 重写)的简单方法。但是,只要您需要执行一些更复杂的事情,它就可能会与 mod_rewrite 发生冲突 - 这是一个常见问题。默认情况下,Apache 不启用 MultiViews(但是,一些共享主机确实启用了它)。