使用重写器时,Url包含子目录


Url includes subdirectory when using a rewriterule

我刚刚将一个网站从一家托管公司转移到另一家。

在最初的主机上,我可以有一个类似site.com/staff的url,这实际上会调用index.php?page=使用RewriteRule的人员。即使主机有一个名为staff的子目录,这也会起作用。这不仅适用于员工页面,也适用于其他页面。

在新主机上,如果我调用site.com/staff,并且有一个staff子目录,我会得到一个URL,如下所示:site.com/staff?page=地址栏中的工作人员。

我在两台主机上都使用相同的.htaccess。

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^print/([^/'.]+)/?$ /print.php?page=$1 [R,NC,L]
RewriteRule ^([^/'.]+)[/]$ /$1 [NC,R]
RewriteRule ^([^/'.?]+)$ /index.php?page=$1 [NC,L]

我认为它可能是vhost.conf、httpd.conf或类似的设置。但是,我无法在原始主机上访问这些内容。

我可以找到解决办法,但我想尝试让新服务器像原来的服务器一样工作。

这是由mod_dir和DirectorySlash引起的。默认情况下,apache会将对缺少尾部斜杠的目录的任何请求(无论重写规则如何)重定向到带有尾部斜杠的同一请求。这样人们就不能偷看你目录中的内容。如果缺少尾部斜杠,则无论是否有索引文件,目录内容都会暴露出来。此重定向将忽略任何可能应用的重写规则。

你;我需要做的是处理mod_rewrite中的尾部斜杠并关闭mod_dir:

DirectorySlash Off
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^print/([^/'.]+)/?$ /print.php?page=$1 [R,NC,L]
RewriteRule ^([^/'.]+)[/]$ /$1 [NC,R]
RewriteRule ^([^/'.?]+)$ /index.php?page=$1 [NC,L]
# in case there's a request for a directory that hasn't been handled
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/ [L]