我正在使用.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>
答案 0 :(得分:10)
这一行:
RewriteCond %{REQUEST_FILENAME} -D
应该是:
RewriteCond %{REQUEST_FILENAME} -d
答案 1 :(得分:6)
不要打扰Mod Rewrite,它有一个指令
<Location /some/path>
DirectorySlash On
SetHandler some-handler
</Location>
答案 2 :(得分: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只会加载条件和规则一次。至少我被建议这样做。
答案 3 :(得分: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>