[英]Mod_rewrite rules for project in .htaccess
我在執行的PHP網站中使用mod_rewrite規則遇到麻煩。
我使用的是Apache 2.4.9(Unix)-Mac OSX Yosemite隨附的apache。
我在項目的根目錄中有.htaccess
文件,並且將其設置為在虛擬主機中運行...因此,我要從中訪問項目的地址是http://project.local
。 這是我在.htaccess
:
RewriteEngine On
# Don't rewrite files
RewriteCond %{REQUEST_FILENAME} !-f
# Don't rewrite directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^pages pages.php [NC]
RewriteRule ^page/([0-9a-zA-Z]+) page.php?var=$1 [QSA]
這是我的虛擬主機設置:
<VirtualHost *:80>
ServerAdmin me@me.com
DocumentRoot "/Users/Me/Sites/project"
ServerName project.local
ServerAlias project.local
ErrorLog "/Users/Me/Sites/logs/project_error_log"
</VirtualHost>
這是我在page.php
中page.php
:
<?php
echo "Hello " . $_GET['var'];
?>
我可以成功訪問http://project.local/pages
,它顯示了上述規則中pages.php
的內容。 但是當我轉到http://project.local/page/testpage
,它顯示的是Hello
而不是$_GET['var']
。 我究竟做錯了什么?
通過將以下代碼放在您的.htaccess中,可以禁用MultiViews
選項:
Options -MultiViews
RewriteEngine On
# Don't rewrite files
RewriteCond %{REQUEST_FILENAME} !-f
# Don't rewrite directories
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^pages pages.php [NC,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^page/([0-9a-zA-Z]+)/?$ page.php?var=$1 [QSA,L,NC]
Apache's content negotiation module
使用Option MultiViews
,該Apache's content negotiation module
在 mod_rewrite
之前運行,並使Apache服務器匹配文件擴展名。 因此/file
可以位於URL中,但它將提供/file.php
。
我通過在.htaccess
文件中添加以下行來解決此問題。
Options FollowSymLinks
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.