Mod rewrite 用于映射一个或两个参数的Mod重写规则

Mod rewrite 用于映射一个或两个参数的Mod重写规则,mod-rewrite,url-rewriting,Mod Rewrite,Url Rewriting,我有以下访问权限: RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^/?([^/]+)/?$ /?page=$1 [L,QSA] RewriteRule ^/?([^/]+)/([^/]+)/?$ /?page=$1&id=$2 [L,QSA] 此规则允许输入URL,如: examp

我有以下访问权限:

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  

RewriteRule ^/?([^/]+)/?$ /?page=$1 [L,QSA]  
RewriteRule ^/?([^/]+)/([^/]+)/?$ /?page=$1&id=$2 [L,QSA]  
此规则允许输入URL,如:

example.com/my-account-dashboard  
example.com/my-account-dashboard/1
以下哪一个是非常漂亮的URL:

example.com?page=my-account-dashboard  
example.com?page=my-account-dashboard&id=1

到目前为止,这一切都很好。但内在的联系与这些参数有关。如果可能的话,是否可以重定向(或其他)到漂亮的URL这方面的重写规则是什么?

首先,请对包含一些错误的当前代码发表几点评论

1)
RewriteCond
仅适用于下一个
RewriteRule
。因此,您的第二个
重写规则可以在没有该条件的情况下匹配(您可以尝试,您将看到)。您需要(再次)将该条件放入另一个
重写规则
(或使用
S
跳过标志来模拟if/else条件,但它会变得非常复杂,毫无意义)

2) 我很确定你不想像你那样使用
QSA
标记。通过使用它,您可以告诉
mod_rewrite
将任何查询字符串附加到重写中。示例:
Example.com/my account dashboard/?foo=bar
将重写为
/?page=my account dashboard&foo=bar
。所以除非你真的想要,否则你不需要它。当直接在重写中添加一些查询字符串时,许多人认为他们需要
QSA
,就像您一样。再说一次,这不是一个会使一切崩溃的错误,但它仍然不是完全正确的

3) 您的规则会创建重复内容,这对SEO(参考)不利。例如,
example.com/my account dashboard
example.com/my account dashboard/
(注意后面的斜杠)都指向同一页。但是搜索引擎不会认为它们是一样的。我邀请你在谷歌(或任何其他你喜欢的搜索引擎)上搜索“重复内容”,看看它。避免这种情况的一种简单方法是选择带或不带尾随斜杠

现在基础清楚了,让我们来回答你的问题。您不能简单地使用从旧url到新url的重定向
R
,因为这样会导致无限循环。此问题存在一些问题:
请求
。当
mod_rewrite
使用它时,它能够知道它来自直接的客户端请求,而不是重定向/重写本身

总而言之,您的代码应该是这样的:

RewriteEngine On
RewriteBase /

# Redirect old-url /?page=XXX to new-url equivalent /XXX
RewriteCond %{THE_REQUEST} \s/\?page=([^/&\s]+)\s [NC]
RewriteRule ^ /%1? [R=301,L]

# Redirect old-url /?page=XXX&id=YYY to new-url equivalent /XXX/YYY
RewriteCond %{THE_REQUEST} \s/\?page=([^/&\s]+)&id=([0-9]+)\s [NC]
RewriteRule ^ /%1/%2? [R=301,L]

# if /XXX is not a file/directory then rewrite to /?page=XXX
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d  
RewriteRule ^/?([^/]+)$ /?page=$1 [L]

# if /XXX/YYY is not a file/directory then rewrite to /?page=XXX&id=YYY
RewriteCond %{REQUEST_FILENAME} !-f  
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/?([^/]+)/([0-9]+)$ /?page=$1&id=$2 [L]  

注意:我选择使用“无尾随斜杠”选项(例如
example.com/my account dashboard
example.com/my account dashboard/1
)。请随意询问。

问题是什么?问题是:如何使用重写规则重定向example.com格式的URL?page=my-account-dashboard&id=1到example.com/my-account-dashboard/1。基本上如何使用结构example.com/parameter page/parameter id/?其他参数id您是指example.com/my account dashboard/2?name=someone to example.com/?page=my account dashboard&id=2&name=someone?确切地说;)如果您以正确(预类型化)的方式输入url,但如果您使用参数(本机)输入url,则上述规则不起作用。我需要一个规则,强制“漂亮”的格式,因为链接有所有的本地格式与常规php参数。嘿,谢谢你的详细回答。到目前为止,这看起来还不错。QSA是必需的,因为有时会有一些附加参数,如。/?page=search&search=asdf。这是怎么做到的?另外,php重定向和表单似乎也有问题。。。这可能是由其他参数引起的。如果需要,请继续使用
QSA
标志。我是说,也许我对此不够清楚。如果
search=asdf
是来自原始url的内容(在重写之前),那么您需要
QSA
来告诉
mod_rewrite
search=asdf
附加到您的重写页面,例如
/?page=search&search=asdf
。否则,你就不需要它了。对于表单问题,您能告诉我每个问题的
操作
值是多少吗?您不应该依赖于旧url被重定向到新url的事实,否则表单就会出现这样的问题。请用新的url格式替换页面中所有位置的旧url