使用。 htaccess只在子目录中重写url

时间:2014-01-15 20:30:25

标签: php apache .htaccess mod-rewrite

我正在尝试配置.htaccess文件以将所有网址重新路由到最近的索引子目录,如下所示:

http://example.com/admin/blah/test/whatever应留在地址栏中,但请指向:

如果url是实际文件的url,则应始终转到该文件。所以http://example.com/admin/blah/file.csshttp://example.com/admin/blah/item.inc如果存在则仍然可以正常工作,否则它应该重定向到该文件夹​​中的index.php,或者如上所示的最近的父文件夹。

我也希望这只会影响子文件夹,如果可能的话。在上面的例子中,我假设.htaccess文件将放在/ admin /文件夹中。

更新 以下是目前的工作原理:

# No Directory Listings or trailing slashes
Options -Multiviews -Indexes +FollowSymLinks

<IfModule mod_rewrite.c>

RewriteEngine On
DirectorySlash Off

# See if the current request is a directory containing an index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.php -f
RewriteRule ^(.*)/?$ $1/index.php [L,QSA]


# if index.php doesn't exist in current dir then
# forward to the parent directory of current REQUEST_URI
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1$2/index.php !-f
RewriteRule ^(.*?/)?([^/]+)/?$ $1 [L,QSA]

</IfModule>

这大部分都有效。如果我输入http://example.com/admin?p=2,它会按预期结算,但如果我使用URL http://example.com/admin/?p=2它也会解析,而不会明确删除尾部斜杠。

2 个答案:

答案 0 :(得分:1)

这是一个相当棘手的规则。请在您的DOCUMENT_ROOT/.htaccess文件中尝试此操作:

RewriteEngine On
RewriteBase /

# if index.php doesn't exist in current dir then
# forward to the parent directory of current REQUEST_URI
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1$2/index.php !-f
RewriteRule ^(.*?/)?([^/]+)/?$ $1 [L]

答案 1 :(得分:0)

这是最终起作用的。

在我的.htaccess文件中,我有:

# No Directory Listings
Options -Multiviews -Indexes +FollowSymLinks

<IfModule mod_rewrite.c>

RewriteEngine On
DirectorySlash Off

# see if the current directory contains an index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}/index.php -f
RewriteRule ^(.*)/?$ $1/index.php [L,QSA]


# if index.php doesn't exist in current dir then
# forward to the parent directory of current REQUEST_URI
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{DOCUMENT_ROOT}/$1$2/index.php !-f
RewriteRule ^(.*?/)?([^/]+)/?$ $1 [L,QSA]

</IfModule>

现有目录的链接在该目录中查找index.php。指向现有文件的链接显示该文件。其他所有内容都重定向到我的index.php。从那里,我可以正常阅读$ _GET的任何查询,我可以阅读并解析完整的URL以查看要显示的页面。如果我不希望它应用于整个站点,这也适用于子目录。