多个htaccess重写规则

时间:2013-07-01 19:36:04

标签: .htaccess mod-rewrite

这是我的.htaccess文件的代码

Options -Indexes
RewriteEngine On
RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^([a-z0-9]+)$ /profile.php?username=$1 [L]
RewriteRule ^([a-z0-9]+)$ /display.php?page=$1 [L]

对于第一个它正常工作,并显示如下: www.site.com/user

第二个不起作用,通常显示如下www.site.com/display.php?page=10。我想显示像www.site.com/article这样的页面 我尝试了不同的东西而没有结果。请告诉我如何使用多个规则。另外请给我一个关于如何在php中使用这些功能的建议,因为我觉得我做的事情并不是很好。我使用此规则的PHP代码是:

<p><a class="button" href="/<?php echo $user_data['username']; ?>"> Profile</a></p>

它有效,但也许是一个更好的方法来建立一个利用htaccess的链接。

4 个答案:

答案 0 :(得分:23)

您遇到冲突的两个规则,使用的模式是完全相同的,这意味着,除了仅应用于第一个规则的条件之外,这两个规则完全无法区分。 / p>

鉴于此URL:

http://www.site.com/blah

blah”是一个页面还是一个用户?无法分辨,因为两个规则的正则表达式模式(^([a-z0-9]+)$)匹配“blah”。因此,第一个将始终应用,无论。您需要添加一些内容来区分2,例如在URL中包含“用户”或“页面”:

http://www.site.com/user/blah
http://www.site.com/page/bleh

你的规则如下:

Options -Indexes
RewriteEngine On

RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^user/([a-z0-9]+)$ /profile.php?username=$1 [L]

RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^page/([a-z0-9]+)$ /display.php?page=$1 [L]

答案 1 :(得分:3)

Options -Indexes
RewriteEngine On

RewriteCond %(REQUEST_FILENAME) !-f
RewriteCond %(REQUEST_FILENAME) !-d
RewriteRule ^user/([a-z0-9]+)$ /profile.php?username=$1 [N]
RewriteRule ^page/([a-z0-9]+)$ /display.php?page=$1 [L]

使用[N](下一步)继续向相同条件添加规则 和[L](最后)确定最后一条规则

答案 2 :(得分:2)

我让它像这样工作。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain/index.php/$1 [C]

#second condition and rule
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /domain/subdir/index.php/$1 [L]

答案 3 :(得分:1)

经过反复试验:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*?\/)*?([a-z\.\-]+)(\d+)\.(bmp|css|cur|gif|ico|jpe?g|js|png|svgz?|webp|webmanifest)$ $1$2$4 [NC]

# Send would-be 404 requests to Craft
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule (.+) index.php?p=$1 [L]
</IfModule>

我收到的提示是[L]表示最后一条规则,[N]表示继续。