.htaccess返回500但在重新安排规则时得到修复

时间:2017-07-07 10:47:13

标签: apache .htaccess mod-rewrite

.htaccess文件中发生了一些奇怪的事情

不起作用的文件

RewriteEngine On
RewriteBase /

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

RewriteRule ^(.*?)/([a-z0-9_-]+)$ $1/post?id=$2 [L,QSA]
RewriteRule ^(.*?)/edit/([a-z0-9_-]+)$ $1/editpost.php?id=$2 [L,QSA]

#RewriteRule ^users/(\d+)*$ ./profile.php?id=$1

但这有效

RewriteEngine On
RewriteBase /

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

RewriteRule ^(.*?)/edit/([a-z0-9_-]+)$ $1/editpost.php?id=$2 [L,QSA]
RewriteRule ^(.*?)/([a-z0-9_-]+)$ $1/post?id=$2 [L,QSA]

#RewriteRule ^users/(\d+)*$ ./profile.php?id=$1

我只是重新安排了重写规则并修复了问题。谁能解释为什么会这样?我被困在这里超过2小时。

我是网址重写的新手,请详细说明。实际上[L,QSA]的作用是什么?

1 个答案:

答案 0 :(得分:1)

RewriteCond仅适用于最近的RewriteRule。因此,在您的第一个示例中,它仅适用于此规则:

RewriteRule ^(.*?)/([a-z0-9_-]+)$ $1/post?id=$2 [L,QSA]

两个底部RewriteRule在没有任何RewriteCond的情况下执行,并导致无限循环。

您可以将规则视为:

RewriteEngine On
RewriteBase /

# skip all files and directories from rules below    
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]

RewriteRule ^(.*?)/edit/([\w-]+)/?$ $1/editpost.php?id=$2 [L,QSA]

RewriteRule ^users/(\d+)/?$ profile.php?id=$1 [L,QSA]

RewriteRule ^(.*?)/([\w-]+)/?$ $1/post?id=$2 [L,QSA]