RewriteRule htaccess总是删除尾随斜杠甚至目录

时间:2014-03-25 18:00:28

标签: php apache .htaccess mod-rewrite rewrite

目标是结合多个规则:

  • URI中没有尾部斜杠
  • 在调用domain.tld / somedir
  • 时在内部重写到index.php(domain.tld / somedir / index.php)
  • 删除文件扩展名,检查是否存在+'。php'并最终在内部重写

这是在'.htaccess'中完成的,因为这是我唯一可以访问的。

到目前为止我的尝试

# check if *.php exists
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*[^/])/?$ $1.php [L, QSA]

# do not allow trailing slash
RewriteRule (.*)/ $1 [L, R=301]

这里的困难是查询'domain.tld / somedir'在被重定向到'domain.tld / somedir /'之后通常会调用目录的index.php。但是,我想在查询'domain.tld / somedir'时在内部调用index.php(没有301)直接

2 个答案:

答案 0 :(得分:5)

您可以使用此代码:

DirectoryIndex index.php
RewriteEngine On

# remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s(.+?)/+[?\s]
RewriteRule ^(.+?)/$ /$1 [R=301,L]

# To internally forward /dir/file to /dir/file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f [NC]
RewriteRule ^(.+?)/?$ /$1.php [L]

答案 1 :(得分:0)

可以启用/禁用名为DirectorySlash的apache中的单独设置。您可以在httpd.apache.org/docs/2.2/mod/mod_dir.html#directoryslash阅读更多内容,但请务必阅读有关为什么会在下面的内容中执行此操作的部分"一些很好的理由"。另请注意安全问题。