新目录的不同 .htaccess 重写规则
Different .htaccess rewrite rules for new directory
我的 .htaccess 当前使用以下重写规则具有以下行为:
https://example.com/abcd?lol=true
- 如果文件
/abcd.php
存在,打开 https://example.com/abcd.php?lol=true
- 如果目录和文件
/abcd/index.php
存在,打开https://example.com/abcd/index.php?lol=true
- 否则打开
https://example.com/index.php?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/index.php?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.php
(DirectoryIndex
)发出内部子请求。您应该根据需要直接重写 index.php
(不需要斜杠前缀)。此处不需要捕获模式 ^(.*)$
。
我的 .htaccess 当前使用以下重写规则具有以下行为:
https://example.com/abcd?lol=true
- 如果文件
/abcd.php
存在,打开https://example.com/abcd.php?lol=true
- 如果目录和文件
/abcd/index.php
存在,打开https://example.com/abcd/index.php?lol=true
- 否则打开
https://example.com/index.php?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/index.php?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.php
(DirectoryIndex
)发出内部子请求。您应该根据需要直接重写 index.php
(不需要斜杠前缀)。此处不需要捕获模式 ^(.*)$
。