将查询参数转换为漂亮 URL

Convert Query Parameters to Pretty URL

我有脚本文件 post.php,我使用的是没有 .php 扩展名的代码,使用下面的代码

Options -Indexes

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ .php [NC,L]

我想用个漂亮的URL。例如,当我请求 URL /post/12 它应该给我 $_GET 参数 12 就像我使用查询字符串一样:post?id=12.

可能吗?此外,我不想将所有请求都定向到 index.php。仅对 posts.php 脚本发出的请求。

在附加 .php 扩展名的通用重写之前,使用单独的规则处理 /post/12 形式的请求。

这样试试:

Options -Indexes -MultiViews

RewriteEngine On

# Remove trailing slash if not a directory
# eg. "/post/" is redirected to "/post"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)/$ / [R=301,L]

# Rewrite "/post/<id>" to "/post.php?id=<id>"
RewriteRule ^(post)/(\d+)$ .php?id= [L]

# Rewrite "/post" to "/post.php" (and other extensionless URLs)
RewriteCond %{DOCUMENT_ROOT}/.php -f
RewriteRule (.*) .php [L]

备注:

  • 需要禁用 MultiViews 才能使第二条规则生效。
  • 您附加 .php 扩展名的初始规则不太正确。在某些情况下,它可能会导致 500 错误。但是,第一个 condition 是多余的 - 在检查请求 + .php does[= 之前​​检查请求是否映射到文件是没有意义的35=] 映射到一个文件。这些是相互包含的表达式。
  • 没有删除尾部斜杠的第一条规则(例如 /post//post),它提出了如何处理 /post/ 请求的问题(没有 id) - 这应该服务于 /post.php(与 /post 相同)还是 /post.php?id=(空 URl 参数)?无论如何,这两者大概是同一件事。但是,这些都会导致重复内容(可能),因此需要重定向。