如何使用 .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
标志使 contacts
、CONTACTS
和 CoNtAcTs
都解析为相同的内容。 (所以仍然需要 rel="canonical"
标签来解决这个歧义。)
我该如何清洁 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
标志使 contacts
、CONTACTS
和 CoNtAcTs
都解析为相同的内容。 (所以仍然需要 rel="canonical"
标签来解决这个歧义。)