我想用 .htaccess 重写 https://blog/home/post?read=example 到 https://blog/home/example

I want to rewrite https://blog/home/post?read=example to https://blog/home/example with .htaccess

我尝试了很多方法,但 none 奏效了。 Blog 是域的名称,Home 是域中的文件夹,post.php 是从数据库获取详细信息的页面。 所以,在我的域中,我有: home/post.php

RewriteEngine On    # Turn on the rewriting engine
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9_-]+)$ /post?read= [L]    # Handle page requests

以上是我使用的最后一个代码,它不起作用。我收到 404 错误。

RewriteEngine On    # Turn on the rewriting engine
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9_-]+)$ /post?read= [L]    # Handle page requests

The .htaccess is located in the root of the folder.

您似乎忽略了 home 子目录。 (尽管您在问题中提到了 homeHome - 请注意这是 case-sensistive。)如果“/post 是 PHP 文件" 那么您大概应该重写为 post.php,而不仅仅是 post?

请注意,Apache 不支持 line-end 注释,正如您在此处使用的那样。 (最好的情况是它们会被忽略,最坏的情况是它们会触发 500 错误。)

如果 .htaccess 文件位于文档根目录中,如您所建议的,那么您需要编写如下规则:

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^home/([\w-]+)$ home/post.php?read= [L]

\wshorthand字符class与[A-Za-z0-9_]相同。

RewriteRule 模式 与 URL-path 相对于 .htaccess 文件位置的匹配。

另一方面,如果 .htaccess 文件位于 /home 子目录中(即在 /home/.htaccess 中),那么您可以这样编写规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([\w-]+)$ post.php?read= [L]

请注意,替换 字符串上没有斜杠前缀。