2015-05-20 3 views
2

, заставляя это работать, делает мой вид сумасшедшим, поэтому я надеюсь, что вы сможете помочь.Multible RewriteRules приводит к ошибке внутреннего сервера

Я использую Rewrite правила и .htaccess, чтобы сделать мой динамический URL

example.com/page.php?id=1 

выглядеть как этот

example.com/1 

использованием

RewriteRule ^([A-Za-z0-9-]+)/?$ page.php?id=$1 [NC,L] 

, и она отлично работает до сих пор.
Но я также хочу, чтобы скрыть тип файла в URL (impressum.php к impressum) с использованием

RewriteRule (.*) $1.php [L] 

Так как правила работают совершенно правильно до тех пор, как я не использую их обоих в то же самое время. Когда я это сделаю, это выглядит так (мой полный файл)

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule (.*) $1.php [L] 
RewriteRule ^([A-Za-z0-9-]+)/?$ page.php?id=$1 [NC,L] 

, я получаю внутреннюю ошибку сервера. Я пробовал разные версии, например, менял позиции и т. Д., Но я всегда получаю эту ошибку.

Так что мой вопрос: как мне получить оба правила вместе и работать, в то время как окончание URL-адресов все еще скрыто и работает example.com/1?

Большое спасибо за любой ответ

+0

Это потому, что оба условия RewriteRule '(. *) 'и' ([A-Za-z0-9 -] +) 'будет соответствовать'/1' в вашем URL-адресе. Как сервер будет знать разницу между одним нереальным файлом и другим? –

ответ

2

Вы можете использовать следующие в файле .htaccess:

RewriteEngine on 

# Check if the PHP file exists and route accordingly 
RewriteCond %{REQUEST_FILENAME}.php -f 
RewriteRule (.*) $1.php [L] 

# If not, pass the request to page.php if it contains A-Za-z0-9- 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([a-z0-9-]+)/?$ page.php?id=$1 [NC,L] 
+0

Он работает! Большое спасибо – demes

+0

Добро пожаловать. –

2

Вам понадобятся два отдельных правила. Переписать условия будут только получить применяются к непосредственно следующему правилу и с правилом расширения PHP, вы должны проверить, что файл PHP существует перед добавлением PHP до конца:

RewriteEngine on 

RewriteCond %{DOCUMENT_ROOT}/$1.php -f 
RewriteRule ^(.*)$ $1.php [L] 

RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([A-Za-z0-9-]+)/?$ page.php?id=$1 [NC,L] 
Смежные вопросы