.htaccess RewriteRule不能正常工作

时间:2011-02-05 21:53:18

标签: .htaccess mod-rewrite url-rewriting

大家好@ stackoverflow,

也许我对RewriteRule的工作有一个基本的误解。或者可能不是。尽管如此,我现在试图解决这个问题两天,没有任何进展。

这是一个不错的情况:

我有一个带有SEF和mod_rewrite的Joomla网站。

这导致URL: mysite.com/index.php?option=com_remository&Itemid=7

被重写为:

mysite.com/sub-directory/sub-directory/0000-Business-files /

这些是我的.htaccess(所有标准Joomla)中使用的行

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^([^\-]*)\-(.*)$ $1 $2 [N]

RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule ^(.*)$ index.php [F,L]

# RewriteBase /


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$  [NC]
RewriteRule (.*) index.php

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

这就是我想要实现的目标:

访问者使用此网址时 mysite.com/sub目录/子目录/ 0000业务文件/

它应该引导他走向正确的页面。

虽然我知道在URL中使用空格并不是最好的主意,但我面临的事实是这些“宽敞”的URL用于PDF,已经发布了。

我以为我可以使用mod_rewrite来重写这些URL。但我得到的是“找不到页面”

我已将此规则添加到.htaccess文件之上:

RewriteRule ^([^\-]*)\-(.*)$ $1 $2 [N]

但这不起作用。我究竟做错了什么?或者,也可能,我错过了关于何时以及如何使用mod_rewrite的观点?

rgds,Eric

1 个答案:

答案 0 :(得分:0)

首先,apache的默认行为通常是允许映射到底层文件系统的直接URL(相对于文档根目录),并且当您想要解决这个问题时应该使用RewriteRule。看看你的问题,似乎你想要浏览文件系统,所以你应该使用RewriteRule。

如果mysite.com/sub+diretory/sub+directory/0000+Business+files/不起作用(没有您的规则),我想知道:您的服务器上是否有该目录结构?即它看起来像这样吗?

[document root]/index.php
[document root]/sub directory/sub directory/0000 Business files/

如果没有,我不确定我理解你想要实现的目标,以及访问者“通向正确页面”的意思。您是否可以提供用户提供的示例URL,以及您希望为其提供服务的相应URL(或文件系统路径)。

关于你的重写规则,我甚至不确定它是否被允许,我很惊讶你没有得到500内部服务器错误。 RewriteRule接受两个参数(匹配模式和替换)和可选的一些标志,但由于$ 1和$ 2之间的空间,你提供三个参数(+标志)。

编辑:我的模式错了,但它仍然没有多大意义。它匹配任何至少包含一个破折号的URL,然后在第一个破折号之前和之后挑选出部分。因此,对于像“this-is-a-url-path / to-a-file / on-the-server”这样的URL,$ 1将是“this”而$ 2将是“is-a-url-path / to -a文件/在服务器上”。同样,如果我有一些示例网址及其相应的重写,我可以帮助您找到正确的模式。

在旁注中,URL中不允许使用空格,但浏览器和服务器可能会在幕后进行一些工作,从而可以正确地拾取PDF。