实施"友好"使用.htaccess的网址

时间:2015-08-20 10:01:01

标签: .htaccess rewrite

我尝试了其他一些我可以在这里找到的答案,但它没有成功。这很简单。

我想要

/page?id=PAGENAME

可以访问并重定向到

/PAGENAME

你能帮助我吗?

编辑:

感觉就像我已经混乱的.htaccess文件需要包含在这里。我已经启用了基本重写功能,但其他两个特殊页面需要此功能"。在上面要求的解决方案中,我只需要替换" page"有两个页面名称(它的丹麦名字,所以我认为这样更容易)。

目前我有这个。如果您对此有任何改进,我们表示赞赏 - 但我只是想让它与所请求的解决方案一起使用。

# Options -Multiviews -Indexes +FollowSymLinks
RewriteEngine On
RewriteBase /

# Always on https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

# remove trailing slash
#RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L]

#301 Redirect everything .php  to  non php
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^.]+\.)+php?\ HTTP
RewriteRule (.+)\.php?$ http://MYURL.dk/$1 [R=301,L] 

#Hide the .php   from url
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php 

#301 Redirect everything mistype after file extension -

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

#301 Redirect everything to current url - 
RedirectMatch permanent /(.*).php/.* http://MYURL.dk/$1.php

RewriteCond %{REQUEST_FILENAME} -D  
RewriteCond %{REQUEST_URI} !(.*)/$  
RewriteRule ^(.*)$ $1/ [L]  

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

#301 redirect index.php to /
RewriteBase /
RewriteCond %{REQUEST_URI} index.php
RewriteRule .* http://MYURL.dk/ [R=301,L]

#Deny access to songs
RewriteCond $1 !(loadmedia)\.php
RewriteRule ^songs/(.*)$ - [L,F]

2 个答案:

答案 0 :(得分:1)

通常地址栏中的网址应该是

www.siteurl.com/pagename/用于seo目的,然后使用规则从.htaccess中读取此URL,该规则在您的php文件中提供此查询字符串参数值。

.htaccess规则可以像

RewriteRule ^(.*)/$ /page?id=$1 [QSA,L]

答案 1 :(得分:0)

看起来您希望实施“友好”(或“漂亮”)网址,使网址对您的用户更友好(搜索引擎并不介意您的网址是什么样的)。

第一步是更改所有页面链接以使用新的“友好”URL。因此,您的链接应该都是/pagename形式(不是/page?id=PAGENAME)。

然后,在.htaccess中,您需要在内部重写这个“友好”的网址到服务器理解的真实网址。这可以使用mod_rewrite完成。在文档根目录中的.htaccess文件中:

# Enable the rewrite engine
Options +FollowSymLinks
RewriteEngine On

# Rewrite the "friendly" URL back to the real URL
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{QUERY_STRING} !^id=
RewriteRule ^([\w-]*) /page?id=$1 [L]

如果该文件不存在(!-f)且不包含id网址参数,则会在内部重写/<pagename>到{{1}的请求}}。这假设您的/page?id=<pagename>仅包含字符<pagename>a-zA-Z0-9_

如果这是一个新网站,旧网址尚未被外部网站编入索引或引用,那么您可以在此处停止。

但是,如果您要更改现有的网址结构,那么您还需要外部将真实(丑陋的)网址上面的“友好”网址 em>内部重写。 (这实际上就是你在问题中提出的问题。)为了防止重写循环,我们可以检查-(在重写URL时不会改变)。

%{THE_REQUEST}

当您确定此功能正常时,将# Redirect real URLs to "friendly" URLs RewriteCond %{THE_REQUEST} \?id=([\w-]*) RewriteRule ^page$ /%1? [R=302,L] (临时)更改为302(永久)。永久重定向由浏览器缓存,因此可以测试问题。

总而言之,上面两部分一起显示:

301

指令的顺序很重要。在内部重写之前,外部重定向几乎总是

<强>更新#1:

  

我希望# Enable the rewrite engine Options +FollowSymLinks RewriteEngine On # Redirect real URLs to "friendly" URLs RewriteCond %{THE_REQUEST} \?id=([\w-]*) RewriteRule ^page$ /%1? [R=302,L] # Rewrite the "friendly" URL back to the real URL RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{QUERY_STRING} !^id= RewriteRule ([\w-]*) /page?id=$1 [L] 转到/concept?id=NAME/NAME转到/studio?id=NAME - 来自/NAME和{{5}的5-10个不同“页面” {1}}。 [根据以后的评论更正]

由于concept映射到studio,您只需一条规则即可实现所有10-20次重定向:

id=NAME

这会将/NAME等网址重定向到RewriteCond %{QUERY_STRING} ^id=(NAME|foo|bar|baz|abc|def|ghi) RewriteRule ^(concept|studio)$ /%1? [R,L]

与所有外部重定向一样,这应该是.htaccess文件中的第一个规则之一。

当您测试它正常工作时,将/studio?id=foo更改为/foo

使这更“动态”,即。匹配任何“NAME”然后更改 CondPattern ,例如:

R

<强>更新#2:

如果需要网址的路径部分(例如R=301RewriteCond %{QUERY_STRING} ^id=([\w-]*) ),那么您可以像这样修改concept替换:

studio

RewriteRule重定向到RewriteCond %{QUERY_STRING} ^id=([\w-]*) RewriteRule ^(concept|studio)$ /$1/%1? [R,L]

或者,要完全“动态”(请记住,现在将捕获任何):

/concept?id=foo