我正在尝试更改:
example.com/profile.php?id=abcdefgh
简单地说:
example.com/abcdefgh
我在StackOverflow上搜索了一下,我明白我需要对我的.htaccess
做点什么,我尝试了这个代码:
RewriteEngine On
RewriteRule ^([^/]*)$ /profile.php?id=$1 [L]
但似乎没有什么变化,当键入这个URL(example.com/profile.php?id=abcdefgh
(时,它不会被重写。
附言:我不知道上面的代码是否正确,我试过了,因为我从哪里得到的代码也有类似的问题。
这应该可以工作。
Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ profile.php?id=$1 [QSA,L]
您应该请求"漂亮"的URL,即/abcdefgh
。然后,您在.htaccess
中的mod_rewrite指令在内部将其重写为实际处理请求的"真实"URL(即/profile.php?id=$1
(。该指令需要一个形式为/abcdefgh
的URL。然而,在它的当前状态下,我应该期待一个重写循环:
- 请求
/abcdefgh
- 请求被重写为
/profile.php?id=abcdefgh
- 处理重新开始
- 请求被重写为
/profile.php?id=profile.php
(因为正则表达式^([^/]*)$
与重写的URL的profile.php
部分匹配 - 转到#3
在本例中,您可以通过简单地使RewriteRule
模式(regex(更具限制性来避免重写循环。例如,在否定字符类中包含一个点(.
((假设您的新"漂亮"URL不包含点(。
例如:
RewriteRule ^([^/.]+)$ /profile.php?id=$1 [L]
然后,您需要实际将网站上的URL更改为新的"漂亮"URL。
然而,如果你目前得到的是404,那么可能根本没有处理这个指令?是否启用了.htaccess
文件?您的.htaccess
文件中有其他指令吗?
更新:在id中,只允许使用A-Z 字符
在这种情况下,您应该更具体地使用正则表达式,只匹配所需的字符。这有助于避免冲突,并在一定程度上避免文件系统检查的需要,而文件系统检查相对来说是"昂贵的"。但是,请注意,您已经声明了"A-Z",但您的示例中包含小写字母。为了便于论证,我假设id
可以包括a-z和a-z。
所以,现在变成了:
RewriteRule ^([a-z]+)$ /profile.php?id=$1 [NC,L]
不需要其他文件系统检查(之前的RewriteCond
指令(。NC
(nocase
(使正则表达式匹配不区分大小写。
不需要检查请求是否映射到文件(具有前面的条件(,因为regex^([a-z]+)$
永远无法匹配文件(包括文件扩展名(。
也不需要检查请求是否映射到目录,除非您直接请求文档根目录中的目录——这可能"不太可能"。然而,其中存在与该URL结构固有的冲突。如果您需要能够访问一个目录,那么这些目录名将成为无效的ID,因此您需要在系统的其他地方进行其他检查,以确保没有生成映射到文档根目录中物理目录的ID。