如何使用.htaccess重写规则命名相同的文件和目录?

如何使用.htaccess重写规则命名相同的文件和目录?,.htaccess,mod-rewrite,url-rewriting,.htaccess,Mod Rewrite,Url Rewriting,我正在努力开发我的“漂亮URL”,我将是第一个承认我真的不知道自己在做什么的人。不过我正试着把我的头绕在它周围。所以我想做的是有一个file.php,但也有一个名为file的目录。这样我就可以访问www.example.com/file,它应该会打开file.php。但我也希望能够转到www.example.com/file/subfile,它应该转到文件目录中的subfile.php 现在,我能够在所有文件上去掉“.php”,并且我已经知道如何在URL中“隐藏”$\u get参数,但是这个目录

我正在努力开发我的“漂亮URL”,我将是第一个承认我真的不知道自己在做什么的人。不过我正试着把我的头绕在它周围。所以我想做的是有一个file.php,但也有一个名为file的目录。这样我就可以访问www.example.com/file,它应该会打开file.php。但我也希望能够转到www.example.com/file/subfile,它应该转到文件目录中的subfile.php

现在,我能够在所有文件上去掉“.php”,并且我已经知道如何在URL中“隐藏”$\u get参数,但是这个目录/文件问题让我陷入了一个循环。感谢您的帮助

这是我当前的.htaccess

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dire1/file/([0-9]+) dir1/file.php?id=$1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dir2/example/([0-9]+) dir2/example.php?id=$1 [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]

这是因为
mod dir
Apache目录模块在
mod rewrite
之前运行。当您请求一个不带斜杠的现有目录时,
mod dir
会发出一个从
/dir
/dir/
的永久301重定向,这就是您无法重写uri的原因

要解决这个问题,您需要告诉mod dir在请求没有跟踪斜杠的目录时不要执行重定向。您可以在htaccess中使用
DirectorySlash
指令来更改此行为

将以下行添加到htaccess:

DirectorySlash off
参考:
这是因为
mod dir
Apache目录模块在
mod rewrite
之前运行。当您请求一个不带斜杠的现有目录时,
mod dir
会发出一个从
/dir
/dir/
的永久301重定向,这就是您无法重写uri的原因

要解决这个问题,您需要告诉mod dir在请求没有跟踪斜杠的目录时不要执行重定向。您可以在htaccess中使用
DirectorySlash
指令来更改此行为

将以下行添加到htaccess:

DirectorySlash off
参考:

这样做:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dire1/file/([0-9]+) dir1/file.php?id=$1 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dir2/example/([0-9]+) dir2/example.php?id=$1 [NC,QSA,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
当URI为
example.com/file/

请注意,如果您提供
example.com/file
(无尾随斜杠),则Apache的
mod_dir
模块将在最后添加尾随斜杠,使其成为
example.com/file/
,然后是server
/file.php

关闭此尾随斜杠行为被认为是一种安全风险,它可能会向访问者暴露您的内部目录结构。

请这样做:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dire1/file/([0-9]+) dir1/file.php?id=$1 [NC,QSA,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^dir2/example/([0-9]+) dir2/example.php?id=$1 [NC,QSA,L]

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]
当URI为
example.com/file/

请注意,如果您提供
example.com/file
(无尾随斜杠),则Apache的
mod_dir
模块将在最后添加尾随斜杠,使其成为
example.com/file/
,然后是server
/file.php


关闭此尾随斜杠行为被认为是一种安全风险,它可能会向访问者暴露您的内部目录结构。

在浏览器中输入
www.example.com/file
时有什么问题?它会将我带到目录,不是文件。在浏览器中输入
www.example.com/file
时有什么问题?它会将我带到目录,而不是文件。