Php 重写规则htaccess以始终删除尾部斜杠偶数目录

Php 重写规则htaccess以始终删除尾部斜杠偶数目录,php,apache,.htaccess,mod-rewrite,rewrite,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 %{REQUES

目标是将多个规则结合起来:

永远不要在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在内部被直接称为no 301。

apache中有一个单独的名为DirectorySlash的设置,可以启用/禁用。您可以在上阅读更多内容,但请务必阅读下面关于为什么这样做的部分,其中说明了一些很好的理由。还要注意安全问题。

apache中有一个单独的设置,名为DirectorySlash,可以启用/禁用。您可以在上阅读更多内容,但请务必阅读下面关于为什么这样做的部分,其中说明了一些很好的理由。还要注意安全问题。

您可以使用以下代码:

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]
您可以使用以下代码:

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]

据我所知,主要原因是避免目录列表。因此,我想通过“选项-索引”禁用列表,仍然让查询通过,但在内部将它们重定向到索引页面。是否有一种组合可以避免使用斜杠而仍然显示索引页?还有一种说法:DirectoryIndex将仅对使用斜杠结尾请求的目录求值。这意味着索引页将不会加载,除非您有一个尾随斜杠。此外,html中的相对链接将被破坏,因为html不会将当前页面视为目录,而是文件。。。但是考虑到你关于安全问题的建议,我可能更喜欢只使用文件扩展名隐藏。禁用目录列表对我来说是一项非常重要的任务,只要删除mod_autoindex,目录就不会被列出。如果没有针对没有索引页的路径的特定处理程序,那么将发出404。安全性问题是,如果没有斜杠,索引页将不会被调用,如果可用,mod_autoindex将启动。据我所知,主要原因是避免目录列表。因此,我想通过“选项-索引”禁用列表,仍然让查询通过,但在内部将它们重定向到索引页面。是否有一种组合可以避免使用斜杠而仍然显示索引页?还有一种说法:DirectoryIndex将仅对使用斜杠结尾请求的目录求值。这意味着索引页将不会加载,除非您有一个尾随斜杠。此外,html中的相对链接将被破坏,因为html不会将当前页面视为目录,而是文件。。。但是考虑到你关于安全问题的建议,我可能更喜欢只使用文件扩展名隐藏。禁用目录列表对我来说是一项非常重要的任务,只要删除mod_autoindex,目录就不会被列出。如果没有针对没有索引页的路径的特定处理程序,那么将发出404。安全问题是,如果没有斜杠,索引页将不会被调用,如果可用,mod_autoindex将启动。在我看来,这是最好的解决方案。几个小时后发现。这个答案是删除尾部斜杠和内部转发请求的完美解决方案。我使用了你的示例,但它对目录不起作用,甚至设置了DirectorySlash off。它返回403错误@dcdeiv:请发布一个新问题,详细说明您的设置,以便我调查并回答。@anubhava在这里,我认为这是最好的解决方案。几个小时后发现。这个答案是删除尾部斜杠和内部转发请求的完美解决方案。我使用了你的示例,但它对目录不起作用,甚至设置了DirectorySlash off。它返回403错误@dcdeiv:请发布一个新问题,详细说明您的设置,以便我调查并回答。@anubhava在这里