新目录的不同 .htaccess 重写规则

Different .htaccess rewrite rules for new directory

我的 .htaccess 当前使用以下重写规则具有以下行为:

https://example.com/abcd?lol=true

-> 在所有三种情况下,地址栏仍必须显示 https://example.com/abcd?lol=true

RewriteEngine On

RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ / [L,R=301]

RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ .php [END]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ / [END]

现在回答我的问题:我有一个新目录 /blog/,其中必须发生以下情况:

https://example.com/blog/abcd?lol=true

-> 地址栏必须仍然显示 https://example.com/blog/abcd?lol=true 所以我可以使用 php 来阅读 abcd 部分,这可能是文章名称。

如何附加我的 .htaccess 代码来实现此目的?

旁白: 你实际上并没有为 #2 做任何事情(即“如果目录和文件 /abcd/index.php 存在......”) -您可能依赖 mod_dir 的默认行为。但是,如果您请求 /abcd?lol=true 并且 /abcd 作为物理目录存在,则会有一个 301 外部重定向来附加尾部斜杠(即 /abcd/?lol=true ),这将导致 /abcd/index.php 正在服务。因此,这并不像您建议的那样在地址栏中严格显示 /abcd?lol=true 。这就是你看到的吗?


要实现 /blog/abcd?lol=true/blog/index.php?lol=true 重写,然后用以下内容替换您的最后一条规则:

# Prevent further processing if a file or directory is requested directly
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [END]

# Route requests to blog/index.php
RewriteRule ^blog/. blog/index.php [END]

# Everthing else is routed to "/index.php"
RewriteRule . index.php [END]

这将文件系统检查分离到它们自己的规则中,因此您不会重复执行此操作。


您之前的“最后”规则:

RewriteRule ^(.*)$ / [END]

您只是重写了 /,然后依赖 mod_dir 为 index.phpDirectoryIndex)发出内部子请求。您应该根据需要直接重写 index.php (不需要斜杠前缀)。此处不需要捕获模式 ^(.*)$