.htaccess htaccess -在URL末尾添加尾随斜杠

nle07wnf  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(122)

目前,文件扩展名.php已从我的URL中正确删除。但这些URL在www.example.com/thema下没有尾随斜杠,在www.example.com/thema/下有尾随斜杠。
我的.htaccess文件的内容:

DirectoryIndex index.php

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    RewriteCond %{HTTP_HOST} !^www\.example\.com$
    RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

    # redirect file.php to /file/
    RewriteCond %{THE_REQUEST} \s/+(.+?)\.php\s [NC]
    RewriteRule ^ /%1/ [R=302,NE,L]

    # added .php extension to /file by checking presence of file.php
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{DOCUMENT_ROOT}/$1.php -f
    RewriteRule ^(.+?)/?$ $1.php [L]
</IfModule>

能否请您给予一些建议,我需要改变以下几点匹配:

  • 域应在https下可用
  • 主页应仅在www.example.com(w/o尾随斜杠)下可用
  • 子页面应该仅在尾部带有斜杠(例如www.example.com/thema/)时才可用
pw9qyyiw

pw9qyyiw1#

RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]

在此规则中,您应该重定向到https,而不是http。(此规则中存在http将导致额外的重定向,因为第一个规则将重定向回https。)
然后,您可以在此之后添加另一条规则,以追加尾随的斜杠:

# Append trailing slash
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.+[^/]$ /$0/ [R=301,L]

$0反向引用包含来自RewriteRule * 模式 * 的整个匹配(即整个URL路径,减去斜杠前缀)。
主页应仅在www.example.com(w/o尾随斜杠)下可用
在URL路径的开头总是有一个斜杠(即主机名后立即)。您无法控制此操作但是,它是否显示在浏览器的地址栏中是另一回事-大多数浏览器省略了它,但这只是美观(同样的方式,浏览器倾向于从可见URL中省略www.子域和请求方案,即. httphttps,甚至在某些情况下省略查询字符串)。
有关详细信息,请参阅Webmasters SE site上的此问题:https://webmasters.stackexchange.com/questions/35643/is-trailing-slash-automagically-added-on-click-of-home-page-url-in-browser

  • 旁白:*
# redirect file.php to /file/
RewriteCond %{THE_REQUEST} \s/+(.+?)\.php\s [NC]
RewriteRule ^ /%1/ [R=302,NE,L]

这可能是一个问题,也可能不是一个问题,但如果包含.php扩展名的请求还包含查询字符串,则此规则将失败。要解决此问题并删除.php扩展名,无论查询字符串是否存在,您可以执行以下操作:

# redirect file.php to /file/
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.php$ /$1/ [NC,R=302,L]

初始请求上的任何查询字符串都将保留。
(NB:这最终应该是一个301,一旦你确认它按预期工作。)

# added .php extension to /file by checking presence of file.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

第一个 * 条件 *(RewriteCond指令)是多余的,应该被删除,除非你碰巧也有与.php文件同名的目录 * baseline *,并且访问该目录应该优先?(这似乎不太可能,因为它也会使.php文件从HTTP请求中无法访问。
然而,为了最小化重定向的数量(这并不一定是一个问题),你需要重新排序指令,并在上面讨论的重定向中使用绝对URL。我还假设你没有实现HSTS
举例来说:

DirectoryIndex index.php

RewriteEngine On

# redirect file.php to /file/ (www + HTTPS)
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (.+)\.php$ https://www.example.com/$1/ [NC,R=301,L]

# Append trailing slash to non-files (www + HTTPS)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.+[^/]$ https://www.example.com/$0/ [R=301,L]

# Non-www to www (and HTTPS)
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteRule ^ https://www.example.com%{REQUEST_URI} [R=301,L]

# HTTP to HTTPS remaining URLs
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# added .php extension to /file by checking presence of file.php
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

我删除了<IfModule> Package 器,因为这里不需要(如果没有安装mod_rewrite,它只会用于 * 屏蔽 * 任何错误)。

相关问题