我有一个编码脚本,显示类似example.com/pagename
的网址。
我想使用rewriteengine来显示example.com/page=pagename
并将example.com/pagename
重定向到example.com/
以隐藏脚本类型代码。
是否可以将``完全改为page=
之类的其他东西?
这正是我想要做的。
我已经尝试了一些像
这样的代码RewriteEngine On
RewriteRule ^page\=([^/]*)$ /$1 [L]
它正确显示example.com/page=pagename
,但您可以加载example.com/pagename
和example.com/page=pagenamepagename
答案 0 :(得分:2)
但您可以加载
example.com/?a=pagename
为了防止这种情况,您还需要外部重定向到您想要的URL(在内部重写之前)。为了防止重写循环,您可以查看THE_REQUEST
:
# Redirect typed URLs to the desired URLs
RewriteCond %{THE_REQUEST} \?a=([^\ ]*)
RewriteRule ^$ /page=%1? [R,L]
替换上的尾随?
会删除原始查询字符串。 (如果您对重定向感到满意,请将其更改为永久重定向,R=301
。)
但您可以加载...
example.com/page=pagename?a=pagename
嗯,这是预期的。但是,page=pagename
将优先,?a=pagename
将被您的重写剥离。但是,要拒绝这样的请求。即。仅在没有查询字符串时重写,然后使用以下条件修改现有规则:
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^page=([^/]*)$ /?a=$1 [L]
这将导致此类URL触发404。
更新#1 :要处理example.com/pagename
的请求,而不是example.com/page=pagename
:
# Redirect "ugly" URLs to the desired URLs
RewriteCond %{THE_REQUEST} \?a=([^\ ]*)
RewriteRule ^$ /%1? [R,L]
# Internally rewrite the "pretty" URL to the real URL
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^([^/]*)$ /?a=$1 [L]
更新#2:以上更严格的版本。这只允许" pagename"由字符a
- z
,A
- Z
,0
- 9
,_
和{{1}组成}}:
-