我尝试了其他一些我可以在这里找到的答案,但它没有成功。这很简单。
我想要
/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]
答案 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-z
,A-Z
,0-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=301
或RewriteCond %{QUERY_STRING} ^id=([\w-]*)
),那么您可以像这样修改concept
替换:
studio
将RewriteRule
重定向到RewriteCond %{QUERY_STRING} ^id=([\w-]*)
RewriteRule ^(concept|studio)$ /$1/%1? [R,L]
。
或者,要完全“动态”(请记住,现在将捕获任何):
/concept?id=foo