MOD_REWRITE 规则-L-R

MOD_REWRITE 规则-L-R

我有这个 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 页面运行。

相关内容