mod_rewrite:添加尾部斜杠?

13

我正在使用一个 .htaccess 文件将对目录的请求重定向到一个自定义的 PHP 文件,该文件提供有关该目录的信息(而且我希望浏览器显示的 URL 不会改变)。

以下是 .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>

根据您所描述的行为,我认为您的.htaccess文件的另一部分可能存在问题,您可以把整个文件贴出来吗? - Tim Stone
4个回答

11

这一行:

RewriteCond %{REQUEST_FILENAME} -D

本应该是:

RewriteCond %{REQUEST_FILENAME} -d

7

DirectorySlash Off 是它的相反操作,它禁用了 mod_dir 在请求资源为目录时自动附加斜线的功能。默认情况下是开启的。为什么它对 OP 不起作用是未知的,可能是因为 mod_dir 没有加载。 - higuita

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>

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只会加载条件和规则一次。至少出于这个原因,我被建议这样做。

你是对的,应该是一个*而不是一个?。我已经在问题上修复了这个问题。我尝试使用了你的建议,但是效果相同。需要明确的是,在我的问题版本和版本中,重定向到了正确的位置。问题在于浏览器显示的文本。我不希望用户看到查询字符串。我只想让他们看到目录的路径,以及一个尾随斜杠。 - bkit
你尝试过只在httpd.conf文件中添加代码而不是.htaccess文件吗?您可以将其保存在单独的httpd-extra.conf文件中,然后在httpd.conf文件末尾使用include命令。 我使用了这段代码来实现您想要的功能,以便我可以提供更加用户友好的URL。最后一行应该提供:将/ path(内部重写)作为/myphp.php?url = path,因此您的浏览器仅显示第一个。 希望能有所帮助。 - misterte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接