2010-06-28 143 views
10

我正在使用一个.htaccess文件来将目录的请求定向到提供有关该目录的信息的自定义php文件(并且我希望浏览器显示的URL不会更改)。mod_rewrite:添加尾部斜杠?

这里是.htaccess文件的相关部分。

RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

这种运作良好,如果你去到一个目录,包括尾随斜线:

http://domain.com/path/ 

但是,如果没有最后的斜线,它不

http://domain.com/path 

的网址(如图所示在浏览器中)变成:

http://localhost:8888/path/?url=/path 

我试着加入这个规则之上的规则解决这个:

RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

但不是为我工作。

我该如何获得.htaccess添加尾部斜杠,如果它被省略,然后就像它在那里一样?

谢谢

更新: 按照要求,这里是整个事情。

<IfModule mod_rewrite.c> 
RewriteEngine On 

#force trailing slashes on real directories 
RewriteCond %{REQUEST_FILENAME} -D 
RewriteCond %{REQUEST_URI} !(.*)/$ 
RewriteRule ^(.*)$ $1/ [L] 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*)$ /myphp.php?url=%{REQUEST_URI} [QSA,L] 

</IfModule> 
+0

根据你描述我认为有一些错误的另一部分的行为的指令你的'.htaccess'文件,所以你介意发布整个事情? – 2010-06-28 18:45:26

回答

8

感叹。

这条线:

RewriteCond %{REQUEST_FILENAME} -D 

本来应该是:

RewriteCond %{REQUEST_FILENAME} -d 
0

您是不是要找

RewriteRule ^(.*)$ $1/ [L] 

呢?

我不知道你的方法。我会尝试像

RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

我用这个重写之前,它的工作原理:

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^domain\.com 
RewriteRule ^(.*)$ http://www.domain.com$1 
RewriteRule ^/(\S+)/?$ /myphp.php?url=$1 

请注意,我并没有包括在第一个规则最后的斜线。除非绝对必要,否则我会建议你不要依赖.htaccess。这是因为服务器会不断检查.htaccess文件。改为使用httpd.conf文件意味着apache只会加载一次条件和规则。至少我被建议这样做是因为这个。

+0

你说得对,那应该是*,而不是?修正了这个问题。我试着用你的建议,但效果相同。要在我的问题和版本中的版本中清楚,重定向将转到正确的位置。问题是浏览器显示的文本。我不希望用户看到查询字符串。我只希望他们看到目录的路径,并以斜线结尾。 – bkit 2010-06-29 18:25:08

+0

您是否尝试仅在httpd.conf文件而不是.htaccess文件中添加代码?您可以将其保存在单独的httpd-extra.conf文件中,然后在httpd.conf文件的末尾使用include命令。 我使用此代码来实现你想要的,所以我可以提供更多的用户友好的网址。最后一行应该提供:将(内部)/ path重写为/myphp.php?url=path,因此您的浏览器仅显示第一个。 希望有所帮助。 – misterte 2010-06-29 18:41:00

0

试试这个。它会将尾部斜杠添加到没有结尾斜杠的目录请求中。

<IfModule mod_rewrite.c> 
RewriteEngine On 

#use the directory viewer on directories without an index page 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^(.*?)/?$ /myphp.php?url=$1/ [QSA,L] 

</IfModule> 
4

不要与现代重写打扰,有它

<Location /some/path> 
    DirectorySlash On 
    SetHandler some-handler 
</Location> 

http://httpd.apache.org/docs/2.2/mod/mod_dir.html

+0

“DirectorySlash Off”做相反的事情时,它会在请求资源是目录时禁用mod_dir自动斜杠附加。默认打开。为什么不为OP工作是未知的,也许mod_dir没有加载 – higuita 2014-07-09 10:14:48