更改URL显示但保留在网站上

时间:2015-08-06 07:48:42

标签: apache .htaccess mod-rewrite redirect

我知道这已经被问过,但我从来没有找到适合我的答案。我尝试了解自己mod_rewrite,但我总是陷入困境。我在网上搜索了很多,我已经阅读了Apache文档,Stackoverflow帖子和一些教程(addbytes / smashingmagazine / selfhtml /等等......)。

用户看到的每个网址目前都是这样的:www.example.com/text/show/1最后的数字会有所不同,因为文本是由CMS编号的。我想在访问www.example.com/home时向用户显示以下网址:www.example.com/text/show/1。当然,这也应该可以在其他网站上使用。 (提示:页面没有连续编号。)

我想使用.htaccess重写用户访问的网址。用户应该留在同一页面上,但他应该看到更好的URL。我没有任何文件扩展名,因为我使用的是来自没有它们的同事的CMS。

这是我的.htaccess:

# Enable rewriting
RewriteEngine On

# Redirect non-www to www
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]

# Redirect old PHP-pages to new pages
Redirect /fancy.php http://www.example.com/text/show/6
Redirect /foobar.php http://www.example.com/text/show/12
# Here are a few more redirects

# URL rewriting
RewriteRule ^home/?$ text/show/1 [NC,L]

# Skip the bli and bla directories
RewriteRule ^(bli|bla)($|/) - [L]

# Skip existing files and directories
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# Rewrite the URL
RewriteRule ^(.*)$ index.php [QSA,L]

我需要重定向,因为我们旧版本的网站中我们没有使用CMS的某些网页仍可在线使用。最后的部分(Skip the bli...之后)是从CMS提供的,因此我无法更改它们。我启用了apache上的mod_rewrite,所以这应该是问题所在。我在更改后也重新加载和/或重新启动了apache。

其他一切运作良好,但RewriteRule ^home/?$ text/show/1 [NC,L]没有。有人可以告诉我如何解决这个问题吗?

PS:我在本地域测试这个,所以我不会在网上犯任何错误。

1 个答案:

答案 0 :(得分:1)

由于您的CMS的性质,这可能不起作用。您的CMS正在重写对/index.php的所有请求,然后可能使用$_SERVER['REQUEST_URI'] PHP超全局(包含请求的URL,即地址栏中的可见URL)来路由请求。< / p>

如果您要将/home重写为/text/show/1(内部),则请求为/home,而不是/text/show/1,这是您的CMS所期望的。我猜你的CMS根本不知道如何路由/home

由于您的CMS已经在使用“漂亮”的网址,因此需要在CMS本身配置(如果支持)。

或者,您可以/home/text/show/1进行外部重定向,但用户会在地址栏中看到/text/show/1,这是不可取的。

除此之外:作为一般规则,您不应在同一.htaccess文件中混合使用mod_alias(Redirect)和mod_rewrite(RewriteRule)指令。由于它们属于不同的Apache模块,因此执行顺序可能与预期不符。