我正在尝试处理我的“漂亮网址”,并且我将第一个承认我真的不知道自己在做什么。我正尽力将它缠住。所以我想做的是有一个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]
答案 0 :(得分:1)
这是因为mod-dir
之前运行的mod-rewrite
Apache目录模块。当您请求不带斜线的现有目录时,mod-dir
发出从/dir
到/dir/
的永久301重定向,这就是为什么您无法重写uri的原因。
要解决此问题,当请求目录中不带斜杠的斜杠时,您需要告诉mod-dir不要执行重定向。您可以在htaccess中使用DirectorySlash
指令来更改此行为。
将以下行添加到您的htaccess中:
DirectorySlash off
答案 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
关闭这种尾随的斜杠行为被视为安全隐患,并且可能会将内部目录结构暴露给访问者。