如何使用 .htaccess 清理 url 以接受或不接受结尾斜线

How to clean url to accept ending slash or not with .htaccess

我该如何清洁 URL http://localhost/mysitedirectory/contacts.php

看起来两者都像:

http://localhost/mysitedirectory/contacts

http://localhost/mysitedirectory/contacts/

我想要这个,因为用户可能会添加结尾的尾部斜杠或保留它,所以我希望 .htaccess 配置为双向工作。

我注意到,当我在 contacts 末尾添加 / 时,它显示“未找到对象”...错误 404

即使添加或不添加斜杠,如何使它工作?

这是我试过的:

RewriteEngine On
Options -Indexes


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^contacts$ contacts.php [L,QSA,NC]
RewriteRule ^home$ index.php [L,QSA,NC]

CBroe 在评论区回答:

^contacts/?$ - 末尾的斜杠,由以下量词问号制成可选。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^contacts$ contacts.php [L,QSA,NC]
RewriteRule ^home$ index.php [L,QSA,NC]

两个 RewriteCond 指令(文件系统检查)完全是多余的,应该删除。 (与 RewriteRule 指令中的 QSA 标志一样。)

但是,不是让 /contacts/contacts/(严格来说是两个 不同 URL)解析相同的内容(这将需要一个 rel="canonical" 标签)你应该从一个外部重定向到另一个(规范)URL.

从外观上看,URL 没有 尾部斜杠是规范的,因此使用外部重定向删除尾部斜杠。唯一要注意的是你不应该从物理目录中删除尾部斜杠(这通常会导致重定向循环)。

例如:

Options -Indexes -MultiViews

RewriteEngine On

# Canonical redirect to remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.+)/$ / [R=301,L]

# Internal rewrites
RewriteRule ^contacts$ contacts.php [L,NC]
RewriteRule ^home$ index.php [L,NC]

RewriteRule 指令上的 NC 标志使 contactsCONTACTSCoNtAcTs 都解析为相同的内容。 (所以仍然需要 rel="canonical" 标签来解决这个歧义。)