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

时间:2018-08-03 19:33:38

标签: .htaccess mod-rewrite url-rewriting

我正在尝试处理我的“漂亮网址”,并且我将第一个承认我真的不知道自己在做什么。我正尽力将它缠住。所以我想做的是有一个file.php,然后还有一个名为file的目录。这样,我可以转到www.example.com/file,它应该可以拉起file.php。但我也希望能够转到www.example.com/file/subfile,它应该转到文件目录中的subfile.php。

现在,我可以删除所有文件上的“ .php”,并且已经弄清楚了如何“隐藏” URL中的$ _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]

2 个答案:

答案 0 :(得分:1)

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

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

将以下行添加到您的htaccess中:

DirectorySlash off

参考: https://httpd.apache.org/docs/2.4/mod/mod_dir.html

答案 1 :(得分:1)

具有这种方式:

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为/file.php时,最后一条规则将服务example.com/file/

请注意,如果您提供example.com/file(不带斜杠),则Apache的mod_dir模块将在末尾添加一个斜杠使其成为example.com/file/,然后再提供服务器/file.php

关闭这种尾随的斜杠行为被视为安全隐患,并且可能会将内部目录结构暴露给访问者。