htaccess RewriteRules 2子文件夹到2个单独的文件

时间:2013-02-09 21:29:15

标签: apache .htaccess mod-rewrite

我正在尝试使用htaccess中的rewriterules将2个单独的虚拟目录重定向到文件

第一个虚拟目录为admin,应该重定向到admin.php

http://dev.int/shop/admin> http://dev.int/shop/admin.php/

http://dev.int/shop/admin/> http://dev.int/shop/admin.php/

http://dev.int/shop/admin/products> http://dev.int/shop/admin.php/products

http://dev.int/shop/admin/products/add> http://dev.int/shop/admin.php/products/add

第二个虚拟目录是其他任何内容,应该重定向到index.php

http://dev.int/shop/anything> http://dev.int/shop/index.php/anything

http://dev.int/shop/anything/else> http://dev.int/shop/index.php/anything/else

还有一些其他标准,目录assets_test以及文件robots.txtsitemap.xml不应重定向

这是我到目前为止所做的,但它不起作用:(

RewriteEngine on
RewriteCond $1 !^(assets|_test)
RewriteCond $1 !^(index\.php|admin\.php|robots\.txt|sitemap\.xml)
RewriteRule ^admin/?(.*)$ /shop/admin.php/$1 [L]
RewriteRule ^(?:admin)/?(.*)$ /shop/index.php/$1 [L]

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# "admin" string is present
RewriteCond %{REQUEST_URI} !(assets|_test|robots\.txt|sitemap\.xml)  [NC]
RewriteCond %{REQUEST_URI}  ^/shop/admin(.*)?/? [NC]
RewriteCond %{REQUEST_URI} !admin\.php          [NC]
RewriteRule .              shop/admin.php%1     [R=301,L]

# "admin" string is NOT present
RewriteCond %{REQUEST_URI} !(assets|_test|robots\.txt|sitemap\.xml|admin)  [NC]
RewriteCond %{REQUEST_URI}  ^/shop(.*)?/?       [NC]
RewriteCond %{REQUEST_URI} !index\.php          [NC]
RewriteRule .              shop/index.php%1     [R=301,L]

admin文件夹后面有/shop/字符串时,会永久重定向:

带有或不带斜线的

http://dev.int/shop/admin/any/number/of/folders

要:

http://dev.int/shop/admin.php/any/number/of/folders

在路径流中用admin替换admin.php而不做任何其他修改。


admin字符串根本不存在时,永久重定向:

带有或不带斜线的

http://dev.int/shop/any/number/of/folders

要:

http://dev.int/shop/index.php/any/number/of/folders

在路径流中的index.php文件夹之后插入/shop/,不做任何其他修改。


当传入的网址包含以下内容时,不会应用上述规则:

路径流中的

assets_testrobots.txtsitemap.xml

对于静默映射,请从R=301中删除[R=301,L]

答案 1 :(得分:0)

感谢@faa的支持和指导。以下是工作答案。

RewriteEngine On

# backend
RewriteCond $1 !^(\.php)  [NC]
RewriteRule ^admin(.*)$ /itmanx/shop/draytek/admin.php$1 [R=301,L]

# frontend
RewriteCond $1 !^(index\.php|admin|assets|__test|robots\.txt|sitemap\.xml)  [NC]
RewriteRule ^(.*)$ /itmanx/shop/draytek/index.php/$1 [R=301,L]