.htaccess RewriteRule to path而不更改URL

时间:2013-09-14 16:03:12

标签: .htaccess mod-rewrite

所以,我有这个问题:

  1. 基本网站位于http://example.com/
  2. 第二个网站位于http://example.com/web2/
  3. 人们向第二个网站提出各种要求 http://example.com/myWeb/pg1http://example.com/web2/pg2
  4. 最近由于其他一些问题,我需要为第二个网站设置一个自定义的新路径,但也要保留第一个网站。

    ideia是允许用户通过以下两个地址访问第二个网站:

    • http://example.com/web2/
    • http://example.com/alternative-url-web2/

    文件夹/web2/实际存在于服务器上,但如何模拟文件夹/alternative-url-web2/并将请求“重定向”到/web2/

    请注意我不希望浏览器上的URL发生变化,这必须是“静默重定向”。我还确保第二个网站不会重定向所有其他请求,例如http://example.com/other

    谢谢。


    更新

    根据@anubhava,我可以通过添加.htaccess来简单地解决这个问题:

    Options +FollowSymLinks -MultiViews
    RewriteEngine On
    RewriteBase /
    RewriteRule ^alternative-url-web2(/.*|)$ /web2$1 [L,NC]
    

    这可能工作正常,但我注意到以下内容:

    • http://ex.com/alternative-url-web2被重定向到http://ex.com/web2/(更改浏览器网址);
    • http://ex.com/alternative-url-web2/被重定向到http://ex.com/(更改浏览器网址);
    • http://ex.com/alternative-url-web2/someRequest工作正常,不会更改浏览器网址;
    • http://ex.com/alternative-url-web2/index.php工作正常,不会更改浏览器网址;

    网站注意:

    /web2/.htaccess 可能导致上面的有线重定向行为...所以这是文件内容:

    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -f [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^(data/|js/|styles/|install/|favicon\.ico|crossdomain\.xml|robots\.txt) - [NC,L]
        RewriteRule ^.*$ index.php [NC,L]
    </IfModule>
    

    内部RewriteRule可以index.php导致所有这些吗?如果是,我该如何解决?

2 个答案:

答案 0 :(得分:5)

通过httpd.conf启用mod_rewrite和.htaccess,然后将此代码放在.htaccess目录下的DOCUMENT_ROOT中:

Options +FollowSymLinks -MultiViews
# Turn mod_rewrite on
RewriteEngine On
RewriteBase /

RewriteRule ^alternative-url-web2(/.*|)$ /web2$1 [L,NC]

替代代码:

RewriteRule ^alternative-url-web2/?$ /web2/ [L,NC]
RewriteRule ^alternative-url-web2/(.+)$ /web2/$1 [L,NC]

答案 1 :(得分:2)

这是一个非常简单的重写。在文档根目录中的htaccess文件中,只需添加以下内容:

RewriteEngine On
RewriteRule ^alternative-url-web2/?(.*)$ /web2/$1 [L]

与重定向不同,重定向使浏览器/客户端发送新URL请求(从而改变浏览器位置栏中的内容),重写完全发生在服务器端。