我有这个 httpd.conf ...
<IfModule mod_rewrite.c>
RewriteEngine On
# Rewrite /foo/bar to /foo/bar.php
RewriteRule ^([^.?]+)$ %{REQUEST_URI}.php [L]
</IfModule>
上述规则对于 ://example.com/dir1/file 运行正常,但对于 ://example.com/dir1/file?q=&category=5&brand=BRAND,它只是将其重写为 ://example.com/dir1/file/?q=&category=5&brand=BRAND,这当然会引发“页面未找到”错误,因为 /file/ 目录不存在。
相同的规则与 [R] 正确重定向到 ://example.com/dir1/file.php?q=&category=5&brand=BRAND,但我不需要重定向。我只想要“内部”重写。
有人能帮忙吗?这是 LAMP,Centos Apache 2。
(此代码在 PLESK、vhost.conf 上运行完美)但在 httpd.conf 上却不行......
答案1
(我还没有尝试你的第二个建议,但是我已经修复了它)向 Google 员工提供一些免费知识: Apache 版本很重要!浏览文档时,请确保您看到的内容与您拥有的 Apache 版本相符。
我的问题是,我使用 PLESK 来做所有事情。vhost.conf 上的这个块:
<IfModule mod_rewrite.c>
RewriteEngine On
# Rewrite /foo/bar/ to /foo/bar/index.php
RewriteRule /([^.?]+)/$ %{REQUEST_URI}index.php [L]
# FIX: If request_uri is just the domain name, then redirect to index.php.
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteRule /(.*) %{REQUEST_URI}/index.php [L]
# Rewrite /foo/bar to /foo/bar.php
RewriteRule /([^.?]+)$ %{REQUEST_URI}.php [L]
# Return 404 if original request is /foo/bar.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* /error [L,R]
</IfModule>
效果非常好。
但在 CentOS/Apache 2 上却不行。问题在于开头的斜杠和 Apache 的自动尾部斜杠添加功能(新版本带来的礼物)。当脚本名为 /file 并且有一个名为 /file/ 的目录时,此自动尾部斜杠添加功能不起作用。所以我添加了以下两行:
<IfModule mod_rewrite.c>
RewriteEngine On
**DirectorySlash Off**
# Rewrite /foo/bar/ to /foo/bar/index.php
RewriteRule **^/?**([^.?]+)/$ %{REQUEST_URI}index.php [L]
# FIX: If request_uri is just the domain name, then redirect to index.php.
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteRule **^/?**(.*) %{REQUEST_URI}/index.php [L]
# Rewrite /foo/bar to /foo/bar.php
RewriteRule **^/?**([^.?]+)$ %{REQUEST_URI}.php [L]
# Return 404 if original request is /foo/bar.php
RewriteCond %{THE_REQUEST} "^[^ ]* .*?\.php[? ].*$"
RewriteRule .* /error [L,R]
</IfModule>
多么酷啊?
答案2
这可能会让你更接近一点:
RewriteRule ^([^.?]+)(.*)$ $1.php$2 [L]
但其他人可能可以提供更好的东西。
尝试一下这个:
RewriteCond %{QUERY_STRING} (.*)
RewriteRule ^(.*/?[^.]+)$ $1.php?%1 [L]
答案3
如果您只想在 URL 中隐藏文件扩展名,为什么不直接启用路径的“MultiViews”选项呢?我经常在我的网站上这样做,这样我就可以混合 .html 和 .php 页面,但不在 URL 中添加扩展名。
如果您的网页配置了“AllowOverride All”或“AllowOverride Options”,您只需添加一个包含以下内容的 .htaccess 文件即可:
Options +MultiViews
这将启用 MultiViews,并且 Apache 将使用 MIME 协商在路径中查找可用文件,或者如果您对 Apache 配置文件有完全控制权,您可以简单地将“MultiViews”添加到配置文件中的“Options”行。
如果你想看一个例子,你可以查看我的 GPG 政策网址http://undergrid.net/legal/gpg它完全从我的 /legal/gpg.php 页面运行。