如何使用.htaccess重写规则命名相同的文件和目录?
我正在努力开发我的“漂亮URL”,我将是第一个承认我真的不知道自己在做什么的人。不过我正试着把我的头绕在它周围。所以我想做的是有一个file.php,但也有一个名为file的目录。这样我就可以访问www.example.com/file,它应该会打开file.php。但我也希望能够转到www.example.com/file/subfile,它应该转到文件目录中的subfile.php 现在,我能够在所有文件上去掉“.php”,并且我已经知道如何在URL中“隐藏”$\u get参数,但是这个目录/文件问题让我陷入了一个循环。感谢您的帮助 这是我当前的.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参数,但是这个目录
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
时有什么问题?它会将我带到目录,而不是文件。