【问题标题】:.htaccess URL rewrite help!.htaccess URL 重写帮助!
【发布时间】:2010-12-23 01:14:09
【问题描述】:

我在我的小 PHP 框架中使用 .htaccess 和 mod_rewrite。它运行良好,但我想扩展它只是让它将所有内容重定向到 index.php。

我的目录结构是这样的(明显简化了)

apps
media
system
-- admin
jscript
templates

我目前的重写规则是:

RewriteEngine On
RewriteCond $1 !^(index\.php|media|jscript)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

如您所见,所有 'mydomain.com/url' 都被重定向到 index.php。我现在想做的是允许任何“mydomain/admin/”指向“system”文件夹内的“admin”目录。我也想要这个文件夹内的正常条件,所以我不会使用干净的用户,而是使用像“mydomain.com/admin/some-kind-of-file.php”这样的网址。

简而言之,我只是希望我的重写条件适用于除我的系统/管理文件夹之外的所有内容。

这可能吗?任何帮助将不胜感激!

【问题讨论】:

  • 请提供 3 个“来自”URL 的列表,以及它们在重写后的样子。例如。 mydomain.com/admin/blah.php => mydomain.com/system/admin/blah.php 因为您的要求看起来并不那么清楚。
  • 抱歉,我会尽量解释清楚一点。我希望任何“mydomain.com/admin”都可以在“system/admin”文件夹中查看。示例:'mydomain.com/admin/install.php' => 'mydomain.com/system/admin/install.php' 'mydomain.com/admin/subfolder/blah.php' => 'mydomain.com/system/管理员/子文件夹/blah.php'

标签: php .htaccess mod-rewrite


【解决方案1】:

只需将admin 添加到您的条件并使用附加规则将其重定向:

RewriteCond $1 !^(index\.php|media|jscript|admin)/
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
RewriteRule ^admin/.* system/$0 [L]

【讨论】:

  • 在 RewriteCond 中添加斜杠是个好主意,除了它会尝试匹配“index.php/”
【解决方案2】:

如果 URL 不以 site.com/index.phpsite.com/mediasite.com/jscript 开头,则以下内容似乎仅适用 RewriteRule。


RewriteEngine On
RewriteCond $1 !^(index\.php|media|jscript)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

说实话,直到现在我还没有看到 $1RewriteCond 中使用,但看起来很有趣。

如果您的网址是site.com/admin...,那该怎么办?那么你需要一个新的 RewriteRule。您还需要防止以admin 开头的 URL 被第一个 RewriteRule 重定向。


RewriteEngine On
RewriteCond $1 !^(index\.php|media|jscript|admin|system)
RewriteRule ^/?(.*)$ index.php/$1 [L,R]

RewriteRule ^/?(admin.*)$ system/$1 [L,R]

更新 1:将 system 添加到不应应用于第一个 RewriteRule 的 URL 列表中。

更新 2:从第一个 RewriteRule 中删除 [L,QSA] 并替换为 [L,R]

【讨论】:

  • Odd... mydomain.com/admin/test.php 重定向到:mydomain.com/system/admin/?install.php 同样,不知道 ?来自!也许我的 apache 安装有问题。我不明白为什么这不起作用!
  • ^/?
  • 我可能对前导斜线有误。我不确定 Apache 如何处理它,因为它是浏览器请求的 URL 的一部分。我只是想让前导斜​​杠可选(? 是一个正则表达式运算符,表示零或一)。跨度>
  • 实际上为什么[QSA]在那里?我会尝试使用[L,R] - [R] 表示通知浏览器重定向到新的 URL。
【解决方案3】:

先把人头重定向到admin文件夹,然后过滤剩下的,比如:

RewriteRule ^admin/([^/]*)$ system/$1 [L,QSA]

RewriteCond $1 !^(index\.php|media|jscript)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

【讨论】:

  • 我最初尝试过这个,很有趣。由于某种原因,它不起作用。如果我输入以下内容:mydomain.com/admin/ 它会将我重定向到这里:mydomain.com/system/admin/?我不知道在哪里?来自!
  • 试试这个:addedbytes.com/apache/mod_rewrite-cheat-sheet 在过去一年左右的时间里,我一直把副本粘在墙上。
【解决方案4】:

看来你的'media'和'jscript'文件夹已经免除了重写规则,你不能也添加'admin'文件夹吗?例如:

RewriteEngine On
RewriteCond $1 !^(index\.php|media|jscript|admin)
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

如果您想真正将 /admin 下的所有内容重定向到 /system/admin(这也会更新用户浏览器中的 URL),您可以使用这样的 mod_alias 规则:

RedirectMatch permanent ^/admin/(.*)$ http://mysite.com/system/admin/$1

【讨论】:

  • 感谢尼克的回复。如果我的帖子不清楚,我很抱歉。 admin 文件夹是 'system' 文件夹的子目录,这意味着上述内容不起作用。虽然我可以将 system/admin 作为重写条件,但我实际上想将 mydomain.com/admin 的任何内容重定向到 mydomain.com/system/admin
  • 我误解了这个问题...已经编辑了帖子来做我认为你想要的事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多