将查询参数转换为漂亮 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 参数)?无论如何,这两者大概是同一件事。但是,这些都会导致重复内容(可能),因此需要重定向。
我有脚本文件 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 参数)?无论如何,这两者大概是同一件事。但是,这些都会导致重复内容(可能),因此需要重定向。